【发布时间】:2014-12-08 19:28:03
【问题描述】:
我有一个非常简单的应用程序,它在后台运行两个服务,使用 IntentService 和 AlarmManager。一个是“消息”服务,它发送 JSON 请求并解析响应,另一个从 LocationManager 轮询位置。这里的要求是它们在一定间隔内无限期地运行,直到用户使用按钮手动停止 - 即使设备的屏幕已经好几天没有打开了。服务绝不能停止。电池寿命不是问题。
我的最低支持 API 是 4.1,我正在 4.1、4.2 和 4.4 设备上进行测试。在我的 Nexus 7 和 GPad 上,分别是 4.4.4 和 4.4.2,服务将无限期地运行并按预期工作。在运行 4.2 的 Galaxy Tab 3 上,设备似乎在 8 小时后进入睡眠状态。左右不活动,然后会退出报告位置和投票。 4.1 的设备似乎也是如此。
有了这种预感,我将其添加到消息传递服务中以手动唤醒 CPU。这个每 60 秒运行一次。所以我希望它可以防止设备进入睡眠状态。
@Override
protected void onHandleIntent(Intent intent)
{
PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK,
"com.service.MESSAGE_SERVICE_WAKE_LOCK");
wl.acquire();
//poll for messages via JSON
wl.release();
}
像这样设置AlarmManager(pi = PendingIntent...传入IntentService类):
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pollInterval, pi);
这似乎为我自己的测试解决了问题,并且设备在 4.4 和 4.2 上始终为我报告位置。但是,4.1 测试人员报告说,大约 8 小时后它仍然会在他们身上睡觉。我还在朋友的 Galaxy S5 (4.4.2) 上进行了测试,几个小时后它就退出了报告位置。
这是我的第一个应用程序,这部分特别令人沮丧。难道我做错了什么?知道为什么这些服务可能会停止运行吗?很高兴提供更多代码,如果有帮助的话……我想我会从这个开始,至少。
【问题讨论】:
-
“这里的要求是它们一直运行到手动停止”——请定义“运行”和“手动停止”。您的意思是“这里的要求是警报不断触发并且服务有机会完成工作,直到手动停止”?这将是合理的,您的问题将是可以解决的。
-
用户可以随时摆脱后台服务。当然,用户也可以摆脱您的警报,但这不太可能。由于内存不足,操作系统也会终止您的进程,这是简单说明您的服务需要运行以响应
AlarmManager事件的路线的另一个好处,因为一旦这些服务完成了它们的工作,它进程是否终止无关紧要。 -
“你有明确的例子吗?” -- 我在
AlarmManager上有a whole chapter,包括一些样本,例如this one。拉里正在讨论的内容很准确,现在我已经确认这几乎是您想要的行为。 -
您是否在清单中注册了接收方? LogCat 是否显示任何值得注意的内容?
-
我会在
AlarmManager上选择cancel()。你不应该两者都需要。
标签: android alarmmanager android-pendingintent locationmanager intentservice