Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android后台服务、警报和在应用程序重启后保留对象引用_Android_Android Service_Alarmmanager - Fatal编程技术网

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

Android后台服务、警报和在应用程序重启后保留对象引用,android,android-service,alarmmanager,Android,Android Service,Alarmmanager,我正在开发一个小的Android应用程序,它需要运行一个后台进程,用于定期启动远程连接,例如,检查服务器上是否有新数据。如果应用程序活动目前未运行,则显然也需要执行此过程 正如我在文档中看到的,有两种方法可以在Android中开发定时后台进程,在应用程序关闭时也可以工作 服务 警报 第一个对我的要求不是很好,因为它可能会在内存不足的情况下被操作系统杀死,所以对我来说是无用的。startForeground不是很好,因为我希望过程是静默的 警报是正常的,因为它不能被操作系统杀死,所以它可以无限期地

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

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

服务 警报 第一个对我的要求不是很好,因为它可能会在内存不足的情况下被操作系统杀死,所以对我来说是无用的。startForeground不是很好,因为我希望过程是静默的

警报是正常的,因为它不能被操作系统杀死,所以它可以无限期地工作。但是如果我使用AlarmManager计划了一个意图,那么如何在应用程序重新启动时保留对该意图的引用

例如,如果我想取消或重新安排报警,我需要通过AlarmManager.cancelIntent I方法引用取消报警的初始意图。但是,如果应用程序由用户重新启动,我如何获得用于启动警报的初始意图的引用


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

是的,请注意,“取消”查找的是挂起事件,而不是意图本身

所以

把你带到你想去的地方


请注意,我并没有得到那个字符串,因为我想要一个唯一的Id/请求代码来实现这个目的,我不会搞砸复制粘贴;在InititalIntent中创建报警时,我引用了相同的数字。

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


只需取消您计划的意图

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

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


遗憾的是,即使是现在它也缺少文档和样本,但我认为它可以满足您的需求。我发现

只要服务器上有新的内容可用,您最好利用GCM推送通知。我正在开发类似的应用程序,其中数据可以从生产者一侧推送到消费者应用程序


您需要查看BroadcastReceiver和GCM特定的通信模型。希望这有助于在内存不足的情况下消除报警。事实上,你的整个应用程序都可以。您无法防止在内存不足时被杀死。的可能重复
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, R.string.some_string, new Intent(this, InitialIntent.class), 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.cancel(pendingIntent);