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

Mr_*_*s_D 5 boot android alarmmanager

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

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

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

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

在概述中 - 应用程序应监视某些手机属性并将其写入文件,直到用户选择将其关闭.

Com*_*are 6

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

您的接收器已经通过清单注册.

哪个是首选方法?

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

如果您打算在设备处于睡眠状态时执行此操作,则您的选项#1将无法正常工作,除非您WakeLock始终保持打开状态,这将导致您的用户想要用霰弹枪向您射击.

这种方法的一些框架代码将受到欢迎.

这是一个示例应用程序,演示AlarmManager_WAKEUP警报的使用(即,您只需要在设备因其他原因已唤醒时发生这些事件).

下面是一个示例应用程序演示使用AlarmManager_WAKEUP警报,用我的WakefulIntentService.WakefulIntentService(或类似的东西),因为需要AlarmManager不守设备清醒很长(只是足够长onReceive()BroadcastReceiver),所以你需要采取额外的步骤,以保持清醒设备足够长的时间给你做你的工作.从理论上讲,你的工作可能足够快,只需要做onReceive()一个BroadcastReceiver,避免需要弄乱WakefulIntentService.但是,您将每次执行磁盘I/O,理想情况下,不应在主应用程序线程上onReceive()进行调用.而且,当你去上传你的数据时,你可能还需要一个WakefulIntentService,无论如何,如果你想在后台也这样做的话.