我正在构建一个应用程序,它会定期监视电池状态,wifi连接和位置数据,并将结果写入文件(然后将它们发送到服务器)。在安装应用程序时,应禁用监视 - 但启用它的用户应在重新启动后继续运行。经过大量阅读后,我意识到我基本上有两个选择:
Service
并将其从我的活动中解雇。将它设置在前景,STICKY和什么不是,并希望它不被android杀死 - 并注意如果android重新创建它(实际上应该有3个服务,所以它们之间的同步可能是凌乱的)。在服务中启动一个线程(我猜不需要Executors)并让它Thread.sleep(REGULAR_INTERVAL)
。唤醒,收集数据将它们写入文件。广播收集的信息并将其显示在我的活动中(如果它正好在运行(将注册广播接收器))。冲洗并重复while(true)
。有办法打断这个我认为我必须在两种情况下注册启动接收器以检查共享首选项(已经完成此操作),并且在情况1启动服务的情况下,在案例2中为注册事件注册接收器并设置报警管理器 - 这是我需要一些骨架代码的部分。
所以 - 在我开始构建之前 - 这将是首选方法?
回顾一下 - 应用程序应监控某些手机属性并将其写入文件,直到用户选择将其关闭。
答案 0 :(得分:6)
在案例2中为报警事件注册接收器并设置报警管理器
您的收件人已经通过清单注册。
哪个是首选方法?
AlarmManager
,假设REGULAR_INTERVAL
通常相当长(例如,超过几分钟)。理想情况下,该间隔是用户可配置的。
如果您打算在设备处于睡眠状态时执行此操作,则您的选项#1将无效,除非您始终保持WakeLock
,这将导致您的用户想要开枪面对霰弹枪。
欢迎使用这种方法的一些骨架代码。
Here is a sample app演示了AlarmManager
对非_WAKEUP
警报的使用(即,您只需要在设备已因其他原因唤醒时发生这些事件)。
Here is a sample app使用my WakefulIntentService
向AlarmManager
警报演示_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非常方便。这种模式众所周知。