我有一个非常简单的应用程序,它在后台运行两个服务,使用带有AlarmManager的IntentService。一个是"消息传递"发送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)上进行了测试,并在几个小时后退出报告位置。
这是我的第一个应用程序,这部分特别令人沮丧。难道我做错了什么?知道为什么这些服务可能会停止运行?很高兴提供更多代码,如果这有帮助......我想,至少从这开始。
答案 0 :(得分:2)
PendingIntent
使用Service
的警报无法保证设备保持足够长的时间以启动或恢复Service
。对于IntentService
,服务在处理完所有排队的Intent
对象后自动死亡。您需要PendingIntent
使用BroadcastReceiver
WakeLock
,Service
并启动您的Service
。然后,{{1}}可以在完成工作后释放唤醒锁,让设备重新进入睡眠状态。
答案 1 :(得分:1)
如果您希望服务“始终”运行,则不应该提供后台服务。
前台服务是一种被认为是某种东西的服务 用户积极地意识到并因此不是系统的候选者 在内存不足时杀人。
为了尝试在操作系统RAM较低时您的服务可以运行多长时间,您可以尝试this sample我已经发布{我已发布here,并使用{{3我已经制作了,它使用越来越多的RAM(真正的RAM,而不是堆)。它导致操作系统杀死其他进程并最终杀死样本本身的进程。
如果您只想让您的服务每X小时/分钟运行一次,那么根本不需要这些服务,您所发现的内容似乎没问题。