我有一个应用程序,应该定期运行后台服务。我使用AlarmManager来实现这个行为。简而言之,它被设置为每分钟运行两次(每30秒一次),并且需要大约20秒来执行(大部分时间在休眠)。
我正在使用多个Android设备进行测试(带有4.1.2的Galaxy SII,带有4.2.2的Nexus 4,以及带有CyanogenMOD 10.1.2和4.2.2的后续设备,以及Nexus 7)。当连接到USB和调试器时,它们都表现得很一致。
一旦我拔掉设备并把它留在桌子上,我会注意到有时候服务会错过一个间隔。仔细查看日志,我发现服务有时会延迟一段时间。如果它应该在xx:05和xx:35运行,我会注意到它会在xx:45开始(比预期晚了10秒)。
服务做的第一件事是获取部分唤醒锁,以确保CPU在运行时不会进入睡眠状态-只有在完成所有工作之后才会释放此唤醒锁。
我的第一个想法是共享资源争用导致了这种行为(应用程序中有其他进程在运行),但服务甚至没有启动,直到大约10秒后才获取唤醒锁。
值得一提的是,在Nexus 4上,这种行为最为明显,达到了30%的数据丢失率,而在Galaxy SII和Nexus 7上则少得多(约2%),但由于这是无法解释的行为,因此仍然有问题。
我正在使用多个Android设备进行测试(带有4.1.2的Galaxy SII,带有4.2.2的Nexus 4,以及带有CyanogenMOD 10.1.2和4.2.2的后续设备,以及Nexus 7)。当连接到USB和调试器时,它们都表现得很一致。
一旦我拔掉设备并把它留在桌子上,我会注意到有时候服务会错过一个间隔。仔细查看日志,我发现服务有时会延迟一段时间。如果它应该在xx:05和xx:35运行,我会注意到它会在xx:45开始(比预期晚了10秒)。
服务做的第一件事是获取部分唤醒锁,以确保CPU在运行时不会进入睡眠状态-只有在完成所有工作之后才会释放此唤醒锁。
我的第一个想法是共享资源争用导致了这种行为(应用程序中有其他进程在运行),但服务甚至没有启动,直到大约10秒后才获取唤醒锁。
值得一提的是,在Nexus 4上,这种行为最为明显,达到了30%的数据丢失率,而在Galaxy SII和Nexus 7上则少得多(约2%),但由于这是无法解释的行为,因此仍然有问题。