我正在构建一个应用程序,它将定期监控电池状态、wifi 连接和位置数据,并将结果写入文件(稍后将它们发送到服务器)。在安装应用程序时,监控应该被禁用——但启用它的用户应该在重启后仍然存在。大量阅读后,我意识到我基本上有 2 个选择:
- 子类
Service
并从我的 Activity 中触发它。将它设置在前台,STICKY 等等,并希望它不会被 android 杀死 - 并注意 android 是否重新创建它(实际上应该有 3 个服务,所以它们之间的同步可能会很困惑)。在服务中启动一个线程(我猜不需要 Executors)并让它Thread.sleep(REGULAR_INTERVAL)
。醒来,收集数据将它们写入文件。广播收集的信息并在我的 Activity 中显示它,如果它恰好正在运行(这将注册一个广播接收器)。冲洗并重复while(true)
。想办法打断这个 - 让我的 Activity 向 AlarmManager 注册一个 PendingIntent - 它将每隔 REGULAR_INTERVAL 运行一次。我没有过多研究这种方法的技术细节——但我希望我能够让这个 PendingIntent 创建并运行一个 IntentService(这似乎是可行的方法——免费使用 Thread 机器并关闭它在其自己的)。欢迎使用此方法的一些框架代码。
我认为在这两种情况下我都必须注册一个引导接收器来检查共享首选项(已经这样做了)并且在情况 1 中启动服务而在情况 2 中为警报事件注册接收器并设置启动警报管理器 - 这是我需要一些框架代码的部分。
那么 - 在我开始构建这个之前 - 哪个是首选方法?
总而言之 - 应用程序应监控一些手机属性并将它们写入文件,直到用户选择将其关闭。
最佳答案
while in case 2 register a Receiver for the alarm event and set the alarm manager up
您的接收器已经通过 list 注册。
which would be the preferred approach ?
AlarmManager
,假设 REGULAR_INTERVAL
通常很长(例如,超过几分钟)。理想情况下,该间隔是用户可配置的。
如果您打算在设备处于 sleep 状态时执行此操作,您的选项 #1 根本不起作用,除非您始终保持 WakeLock
开启,这将导致您的用户想要用猎枪射你的脸。
Some skeleton code for this approach would be welcome.
Here is a sample app演示如何使用 AlarmManager
处理非 _WAKEUP
警报(即,您只需要在设备因其他原因处于唤醒状态时发生这些事件)。
Here is a sample app演示如何使用 AlarmManager
处理 _WAKEUP
警报,使用 my WakefulIntentService
. WakefulIntentService
(或类似的东西)是必需的,因为 AlarmManager
不会让设备保持很长时间的唤醒(只够 onReceive()
BroadcastReceiver
),因此您需要采取额外的步骤来让设备保持唤醒状态足够长的时间,以便您完成工作。 理论上,您的工作可能很快就可以在 BroadcastReceiver
的 onReceive()
中完成,避免与 混淆WakefulIntentService
。但是,您每次都会执行磁盘 I/O,理想情况下不应在调用 onReceive()
的主应用程序线程上执行。而且,当您要上传数据时,您可能需要 WakefulIntentService
,无论如何,如果您也希望在后台执行此操作。
关于安卓设计 : background long running service or AlarmManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15451347/