gpt4 book ai didi

Android AlarmManager 有时会迟到

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:02:49 24 4
gpt4 key购买 nike

我有一个应该定期运行后台服务的应用程序,我正在使用 AlarmManager 来实现此行为。长话短说,它被设置为每分钟运行两次(每 30 秒),并且执行大约需要 20 秒(大部分时间在休眠)。

我正在使用多个 Android 设备进行测试(Galaxy SII 4.1.2、Nexus 4 4.2.2 以及更高版本的 CyanogenMOD 10.1.2 和 Nexus 7 4.2.2)并且它们在连接到 USB 时表现一致和调试器。

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

该服务做的第一件事是获取部分唤醒锁,以确保 CPU 在运行时不会进入休眠状态 - 这个唤醒锁在它完全完成它应该做的事情之前不会被释放。

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

值得一提的是,这种行为在 Nexus 4 上最为明显,其中高达 30% 的数据丢失,而在 Galaxy SII 和 Nexus 7 上明显较少(约 ~2%),但它仍然是一个问题,因为它是无法解释的行为。

最佳答案

您没有说明您使用的是哪种闹钟,但鉴于您的投诉,我认为这是一个_WAKEUP 闹钟。如果是这样,我们拥有的唯一保证是如果我们使用广播 PendingIntent,Android 将在调用 期间保持设备唤醒onReceive()。使用 service PendingIntent,正如您所做的那样,是不可靠的,因为设备可能会在服务启动之前重新进入休眠状态,并且可以获得 WakeLock.

因此,_WAKEUP 警报的更可靠模式是使用广播 PendingIntent,让 BroadcastReceiver acquire() WakeLock,然后让它调用 startService() 将控制权传递给您的服务。您的服务开始工作,然后释放 WakeLock

我将这个模式包裹在 my WakefulIntentService component 中.

关于Android AlarmManager 有时会迟到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17745314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com