I am writing a basic program that triggers an alarm after 5 seconds. However, even after 30 seconds, the alarm is not triggered (the print statement that I have in my individual alarm controller is not executed). This seems strange, considering that it seems that I have calculated the time of the alarm correctly, fed a PendingIntent
containing the alarm controller ( AlarmReceiver
) to my AlarmManager
, and specified the AlarmReceiver
class as a receiver in my AndroidManifest.xml file.
MainActivity.kt
import android.app.AlarmManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
try {
// Initialize the time in which we want to trigger the alarm
val currTimeMs = System.currentTimeMillis()
val fiveSecsLaterMs = currTimeMs + 5 * 1000
println("currTimeMs = $currTimeMs")
println("fiveSecsLaterMs = $fiveSecsLaterMs")
// Initialize the alarm signal
val intent = Intent(applicationContext, AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(applicationContext, 1, intent, 0)
// Send the alarm signal to our AlarmManager
val alarmManager = applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager[AlarmManager.RTC_WAKEUP, fiveSecsLaterMs] = pendingIntent
} catch (e: Exception) {
println("Cannot print alarm!")
}
}
}
AlarmReceiver.java :
package com.example.alarmtestsetter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.widget.Toast;
public class AlarmReceiver extends BroadcastReceiver {
MediaPlayer mp;
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("RECEIVED ALARM!!!!");
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(context, notification);
r.play();
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.alarmtestsetter">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".AlarmReceiver" android:process=":remote" />
</application>
</manifest>
Have you tried using AlarmManagerCompat
?
// Initialize the alarm signal
val intent = Intent(applicationContext, AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(applicationContext, 1, intent, 0)
val alarmManager = applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager
AlarmManagerCompat.setExactAndAllowWhileIdle(
alarmManager,
AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + (5 * DateUtils.SECOND_IN_MILLIS),
pendingIntent
)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.