alarmmanager在一段时间后被取消

56lgkhnf  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(353)

我正在编写我的第一个应用程序,我试图在每天的特定时间触发一个通知,报告一些信息。对于starter,我创建了下面的类,用于在重新启动后重新启动警报,并从主应用程序启动警报(这只需要一段代码即可重用)。

  1. public class SetAlarmReceiver extends BroadcastReceiver {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. startReminderService(context);
  5. }
  6. public void checkServiceRunning(Context context) {
  7. Intent reminderIntent = new Intent(context, AlarmReceiver.class);
  8. reminderIntent.setAction("MyReminder");
  9. // I check if a reminder is already active
  10. boolean reminderActive = (PendingIntent.getBroadcast(context, REMINDER_SERVICE,
  11. reminderIntent,
  12. PendingIntent.FLAG_NO_CREATE) != null);
  13. Log.d("test", "The reminder is active?" + reminderActive);
  14. if (!reminderActive) {
  15. startReminderService(context);
  16. }
  17. }
  18. public void startReminderService(Context context) {
  19. Calendar serviceNotificationTime = Calendar.getInstance();
  20. serviceNotificationTime.set(Calendar.HOUR_OF_DAY, 9);
  21. serviceNotificationTime.set(Calendar.MINUTE, 0);
  22. serviceNotificationTime.set(Calendar.SECOND, 0);
  23. Intent reminderIntent = new Intent(context, AlarmReceiver.class);
  24. reminderIntent.setAction("MyReminder");
  25. PendingIntent pendingIntent = PendingIntent.getBroadcast(
  26. context,
  27. REMINDER_SERVICE,
  28. reminderIntent,
  29. PendingIntent.FLAG_CANCEL_CURRENT);
  30. AlarmManager serviceAlarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
  31. serviceAlarmManager.setRepeating(
  32. AlarmManager.RTC_WAKEUP,
  33. serviceNotificationTime.getTimeInMillis(),
  34. AlarmManager.INTERVAL_DAY,
  35. pendingIntent);
  36. if (pendingIntent != null) {
  37. Log.d("test", "Background service set up and running.");
  38. } else {
  39. Log.d("test", "Failed to set up background service!");
  40. }
  41. }
  42. }

之后,我用以下行更新了清单:

  1. <receiver
  2. android:name="com.mycompany.myapp.services.SetAlarmReceiver"
  3. android:enabled="true"
  4. android:exported="true">
  5. <intent-filter>
  6. <action android:name="android.intent.action.BOOT_COMPLETED" />
  7. </intent-filter>
  8. </receiver>
  9. <receiver
  10. android:name="com.mycompany.myapp.services.AlarmReceiver"
  11. android:enabled="true"
  12. android:exported="true">
  13. <intent-filter>
  14. <action android:name="MyReminder" />
  15. </intent-filter>
  16. </receiver>

到目前为止,一切正常。当手机重新启动时,提醒会正确重新启动(如果提醒时间已过),并立即触发。
alarmreceiver类如下:

  1. public class AlarmReceiver extends BroadcastReceiver {
  2. private Context ctx;
  3. @Override
  4. public void onReceive(Context context, Intent intent) {
  5. this.ctx = context;
  6. remindStuff();
  7. }
  8. private void remindStuff() {
  9. ....
  10. some code
  11. ....
  12. // I check if the alarm is still on (probably awful, since it just fired)
  13. SetAlarmReceiver setAlarmReceiver = new SetAlarmReceiver();
  14. setAlarmReceiver.checkServiceRunning(ctx);
  15. }
  16. }

我使用相同的方法来检查主活动的警报是否开启:

  1. private void checkServicesRunning() {
  2. SetAlarmReceiver setAlarmReceiver = new SetAlarmReceiver();
  3. setAlarmReceiver.checkServiceRunning(getApplicationContext());
  4. }

在我看来一切都是正确的,我已经尝试了我找到的任何解决方案,在stackoverflow上阅读了大量类似我的问题,但我仍然无法理解我做错了什么。系统触发启动后,警报会立即正确触发,当我刚刚启用警报时,警报会正确触发(仅当通知时间是在过去,即晚上10点,警报必须在上午9点触发时)。当checkservicerunning方法运行时,它告诉我警报已经启用(在logcat中返回true),但是当我关闭应用程序并在一段时间后重新运行它时,警报看起来好像被取消了,并且正在由应用程序重新创建。
有什么提示吗?
谢谢。
编辑:我尝试了命令'adb shell dumpsys alarm',它实际上显示我的警报运行正常,所以,在这一点上,我认为问题是其他的,但我不能理解什么。。。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题