应用程序被Android或任务杀手杀死后,如何保存预定的警报?

Div*_*ers 22 android alarmmanager

安排警报的代码.

    PendingIntent sender = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
    am.set(AlarmManager.RTC_WAKEUP, time, sender);
Run Code Online (Sandbox Code Playgroud)

它的工作正常,但当我在任务杀手中杀死我的应用程序时,我丢失了我的预定警报.如何解决这个问题呢?

Jox*_*aex 20

让你的应用程序在被杀死时广播一条消息,当这个消息被广播时,让一个监听器检查服务是否仍在运行..如果它没有运行它.即使应用程序被终止,这也将确保您的服务正在运行.

更新

我将尝试为您创建流程图

死亡/重启服务

onDestroy()方法是服务的一部分.

我希望这有帮助.

更新2

我忘记提到的一件事是,理想情况下,您只需要运行一个服务实例.所以只要查看onStart()中存在的ID应该是== 1来启动它.忽略它.

服务类别的通知方法:

onStart():在启动服务时调用此方法

onDestroy():这是在杀死服务时调用的方法

BroadcastReciever类的通知方法:

onReceive():此方法接收发送给它的所有意图(除非已过滤)

在BroadcastRecievers(消息广播)和服务(启动服务)上查找示例

参考文献:

http://developer.android.com/reference/android/content/BroadcastReceiver.html

http://developer.android.com/reference/android/app/Service.html

  • JoxTraex - 很好的图表! (3认同)
  • 这个答案不应该被接受.如果进程被终止,则不会调用`onDestroy()`.请参阅CommonsWare的回答,提出类似的问题:"有各种情况,其中不会调用活动或服务的`onDestroy()`.这是其中之一"http://stackoverflow.com/a/3595641/ 858626 (3认同)
  • 您可以编写代码示例吗?我不明白为什么这个服务死于应用程序.文档说"注意:警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行" (2认同)
  • **JoxTraex**你有没有尝试过你说的话?似乎APP强制关闭表单任务杀手时onDestroy方法不会调用. (2认同)

小智 6

应用程序关闭时,警报管理器设置的警报不会被终止,如果重新启动,所有警报都会被操作系统清除,因为没有持久性.所以你需要做持久性.

  • 每次设置闹钟时都会保存闹钟时间.
  • 注册接收器以启动完成.
  • 重启时再次设置闹钟.

    public class BootReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            //re register the alarm
       }
    }
    
    Run Code Online (Sandbox Code Playgroud)

的Manifest.xml

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
.......
<receiver
      android:name="BootReceiver"
        android:enabled="true"
        android:exported="true"
        >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

您可以使用SharedPreference来节省时间(触发警报的时间或下次触发警报的时间)

用它在启动接收器上设置新警报.