应用程序重启后Android后台服务,警报和保留对象引用

时间:2014-03-08 18:14:52

标签: android android-service alarmmanager

我正在开发一个小型Android应用程序,需要运行后台进程,用于定期启动远程连接(例如,检查服务器上是否有新数据)。如果此时应用程序活动未运行,此过程显然也需要工作。

正如我在文档中看到的,在Android中开发预定后台进程有两种方法,当应用程序关闭时也可以使用。

  • 服务
  • 警报

第一个对我的要求不太好,因为在内存不足的情况下它可以被操作系统杀死,所以对我来说没用。 startForeground()不太好,因为我希望这个过程是静默的。

警报正常,因为它无法被操作系统杀死,因此它可以无限期地工作。但是......如果我使用AlarmManager安排一个Intent,我怎样才能保留对Intent的引用,在应用程序重启时幸存?

例如,如果我想取消或重新安排警报,我需要引用初始Intent以通过“AlarmManager.cancel(Intent i)”方法取消它。但是如果用户重新启动应用程序,我如何获得用于启动警报的初始Intent的引用?

如果启动应用程序重启,是否有其他方法可以停止警报?

4 个答案:

答案 0 :(得分:0)

是的,请注意,取消正在寻找PendingIntent,而不是Intent本身。

所以

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, R.string.some_string, new Intent(this, InitialIntent.class), 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.cancel(pendingIntent);

让你到达你想去的地方。

请注意,我不是那个字符串的字符串,因为我想要这个意图的唯一ID /请求代码,我不会搞砸复制品;在InititalIntent中创建警报时,我引用了相同的数字。

答案 1 :(得分:0)

这个问题刚刚回答,在这里:

How can I get the context of other activity?

只需取消您安排的意图

答案 2 :(得分:0)

关于警报,您可以使用意图特征取消,因此您不需要引用原始意图。在任何情况下,警报机制仍然需要您在服务上运行某些东西。

无论如何,您错过了另一种可能的解决方案:SyncAdapter。它的目的是与服务器同步,但你可以在代码中做任何你想做的事情,操作系统不太可能会杀掉它,而不是你提到的其他解决方案。

可悲的是,即使现在它缺乏文档和样本,但我认为它可以满足您的需求。 Here's我发现了什么

答案 3 :(得分:0)

最好的办法是,只要服务器上有新功能,就可以用来推送通知(通过GCM)。我正在开发类似的应用程序,可以从一侧(生产者)推送数据,并且需要将其推送到消费者应用程序。

您需要查看BroadcastReceiver和GCM特定的通信模型。希望这有帮助