5

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

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

我想我必须在两种情况下都注册一个启动接收器来检查共享首选项(已经这样做了),如果 1 启动服务,而如果 2 为警报事件注册一个接收器并设置警报管理器- 那是我需要一些骨架代码的部分。

那么 - 在我开始构建这个之前 - 这将是首选方法吗?

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

4

3 回答 3

6

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

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

哪种方法是首选方法?

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

如果您打算在设备处于休眠状态时也这样做,那么您的选项 #1 根本不起作用,除非您一直保持WakeLock开启状态,这将导致您的用户想要用霰弹枪朝您的脸开枪。

这种方法的一些骨架代码将受到欢迎。

这是一个示例应用程序,演示了AlarmManager用于非_WAKEUP警报的用途(即,您只需要在设备由于其他原因已经唤醒时发生这些事件)。

这是一个示例应用程序AlarmManager_WAKEUP使用我的WakefulIntentService. WakefulIntentService(或类似的东西)是必要的,因为AlarmManager不会让设备保持清醒很长时间(刚好足够onReceive()a 的时间BroadcastReceiver),因此您需要采取额外的步骤来让设备保持足够长的清醒时间以便您完成工作。从理论上讲,您的工作可能很快就可以完成,onReceive()BroadcastReceiver无需弄乱WakefulIntentService. 但是,您将每次都执行磁盘 I/O,理想情况下不应在onReceive()调用的主应用程序线程上执行此操作。而且,当您上传数据时,您可能需要一个WakefulIntentService那么,无论如何,如果您也想在后台执行此操作。

于 2013-03-16T16:13:07.810 回答
1

使用第二个选项,并且应该使用 intentService + AlarmManager 看到这个例子http://www.dotkam.com/2011/01/10/android-prefer-alarms-and-intent-receivers-to-services/

于 2013-03-16T20:14:01.507 回答
0

根据重复任务的长度,您可以选择多种方法之一。这个问题讨论了它们 -在 Android 中调度重复任务

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

于 2013-03-16T16:19:57.463 回答