IntentService,PendingIntent和AlarmManager:无法使进程无限期地运行?

时间:2014-12-08 19:28:03

标签: android alarmmanager android-pendingintent locationmanager intentservice

我有一个非常简单的应用程序,它在后台运行两个服务,使用带有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)上进行了测试,并在几个小时后退出报告位置。

这是我的第一个应用程序,这部分特别令人沮丧。难道我做错了什么?知道为什么这些服务可能会停止运行?很高兴提供更多代码,如果这有帮助......我想,至少从这开始。

2 个答案:

答案 0 :(得分:2)

PendingIntent使用Service的警报无法保证设备保持足够长的时间以启动或恢复Service。对于IntentService,服务在处理完所有排队的Intent对象后自动死亡。您需要PendingIntent使用BroadcastReceiver WakeLockService并启动您的Service。然后,{{1}}可以在完成工作后释放唤醒锁,让设备重新进入睡眠状态。

答案 1 :(得分:1)

如果您希望服务“始终”运行,则不应该提供后台服务。

改为foreground service

  

前台服务是一种被认为是某种东西的服务   用户积极地意识到并因此不是系统的候选者   在内存不足时杀人。

为了尝试在操作系统RAM较低时您的服务可以运行多长时间,您可以尝试this sample我已经发布{我已发布here,并使用{{3我已经制作了,它使用越来越多的RAM(真正的RAM,而不是堆)。它导致操作系统杀死其他进程并最终杀死样本本身的进程。

如果您只想让您的服务每X小时/分钟运行一次,那么根本不需要这些服务,您所发现的内容似乎没问题。