Android AlarmManager有时会迟到

时间:2013-07-19 11:44:16

标签: android service alarmmanager

我有一个应用程序应该定期运行后台服务,我正在使用AlarmManager来实现这种行为。长话短说,它设置为每分钟运行两次(每30秒),执行大约需要20秒(大多数是睡觉)。

我正在使用几款Android设备进行测试(Galaxy SII 4.1.2,Nexus 4 4.2.2及更高版本,CyanogenMOD 10.1.2和Nexus 7 4.2.2),所有这些设备在连接USB时表现一致和调试器。

拔下设备并将其放在桌面上后,我注意到有时服务将错过一个时间间隔。仔细查看日志,我发现该服务有时会在一段时间内延迟。如果它应该在xx:05和xx:35运行,我会注意到它从xx:45开始(比它应该晚了10秒)。

该服务的第一件事就是获取部分唤醒锁定,以确保CPU在运行时不会进入休眠状态 - 这个唤醒锁定在它完全按照预期完成后才会被释放。

我的第一个想法是导致行为的一些共享资源争用(还有其他进程与应用程序一起运行)但是服务甚至没有启动,它甚至没有获得唤醒锁定直到10几秒钟后。

值得一提的是,这种行为在Nexus 4上最为明显,其中高达30%的数据缺失,而Galaxy SII和Nexus 7(约为2%)则显着减少,但它仍然是一个问题,因为它是不明原因的行为。

1 个答案:

答案 0 :(得分:3)

您没有说明您正在使用什么类型的警报,但鉴于您的投诉,我认为这是_WAKEUP警报。如果是这样,我们只有 保证,如果我们使用广播 PendingIntent,Android会在调用onReceive()期间让设备保持唤醒状态。正如您所做的那样,使用服务 PendingIntent是不可靠的,因为设备可能会在服务启动之前重新入睡,并且可以获得WakeLock

因此,_WAKEUP警报的更可靠模式是使用广播PendingIntentBroadcastReceiver acquire() WakeLock,然后拥有它致电startService()将控制权传递给您的服务。您的服务可以正常运行,然后发布WakeLock

我将此模式包含在my WakefulIntentService component中。