Android设计:后台长时间运行服务还是AlarmManager?

时间:2013-03-16 15:59:27

标签: android alarmmanager boot

我正在构建一个应用程序,它会定期监视电池状态,wifi连接和位置数据,并将结果写入文件(然后将它们发送到服务器)。在安装应用程序时,应禁用监视 - 但启用它的用户应在重新启动后继续运行。经过大量阅读后,我意识到我基本上有两个选择:

  • 子类Service并将其从我的活动中解雇。将它设置在前景,STICKY和什么不是,并希望它不被android杀死 - 并注意如果android重新创建它(实际上应该有3个服务,所以它们之间的同步可能是凌乱的)。在服务中启动一个线程(我猜不需要Executors)并让它Thread.sleep(REGULAR_INTERVAL)。唤醒,收集数据将它们写入文件。广播收集的信息并将其显示在我的活动中(如果它正好在运行(将注册广播接收器))。冲洗并重复while(true)。有办法打断这个
  • 让我的活动在AlarmManager中注册一个PendingIntent - 它将运行每个REGULAR_INTERVAL。我没有深入研究这种方法的技术细节 - 但我希望我能够使这个PendingIntent创建并运行一个IntentService(这似乎是要走的路 - 免费使用Thread机器以及关闭在其自己的)。这种方法的一些骨架代码将受到欢迎。

我认为我必须在两种情况下注册启动接收器以检查共享首选项(已经完成此操作),并且在情况1启动服务的情况下,在案例2中为注册事件注册接收器并设置报警管理器 - 这是我需要一些骨架代码的部分。

所以 - 在我开始构建之前 - 这将是首选方法?

回顾一下 - 应用程序应监控某些手机属性并将其写入文件,直到用户选择将其关闭。

3 个答案:

答案 0 :(得分:6)

  

在案例2中为报警事件注册接收器并设置报警管理器

您的收件人已经通过清单注册。

  

哪个是首选方法?

AlarmManager,假设REGULAR_INTERVAL通常相当长(例如,超过几分钟)。理想情况下,该间隔是用户可配置的。

如果您打算在设备处于睡眠状态时执行此操作,则您的选项#1将无效,除非您始终保持WakeLock,这将导致您的用户想要开枪面对霰弹枪。

  

欢迎使用这种方法的一些骨架代码。

Here is a sample app演示了AlarmManager对非_WAKEUP警报的使用(即,您只需要在设备已因其他原因唤醒时发生这些事件)。

Here is a sample app使用my WakefulIntentServiceAlarmManager警报演示_WAKEUP的使用情况。 WakefulIntentService(或其类似内容)是必要的,因为AlarmManager不会让设备保持很长时间(仅onReceive()的{​​{1}}),所以你需要采取额外措施使设备保持足够长的时间以便您完成工作。 理论上,您的工作可能足够快,只能在BroadcastReceiver的{​​{1}}内完成,从而无需弄乱onReceive()。但是,您将每次执行磁盘I / O,理想情况下,不应在调用BroadcastReceiver的主应用程序线程上执行此操作。而且,当你去上传你的数据时,你可能需要一个WakefulIntentService,无论如何,如果你想在后台也这样做。

答案 1 :(得分:1)

使用第二个选项,并且应该使用intentService + AlarmManager,请参阅此示例http://www.dotkam.com/2011/01/10/android-prefer-alarms-and-intent-receivers-to-services/

答案 2 :(得分:0)

根据周期性任务的长度,您可以选择以下几种方法之一。这个问题讨论了它们 - Scheduling recurring task in Android

当任务休眠时间为15分钟或更长时,使用AlarmManager非常方便。这种模式众所周知。