Android的Wakelock是后台服务的必需品吗?

neo*_*ion 8 android android-service android-wake-lock wakelock

我正在编写一个长期运行的后台服务,用于收集和分析设备数据.为此,我启动一项服务,该服务生成一个线程,该线程进行数据收集/分析.

从我的阅读中我了解到,如果我希望服务在屏幕被锁定/设备正在休眠时这样做,我应该使用部分唤醒锁来确保cpu在服务的线程运行时不会进入休眠状态.但是我真的对此感到困惑,因为我目前没有使用唤醒锁,我可以通过任务管理器来设置我的应用程序或锁定屏幕或杀死应用程序,每次我这样做,我都可以通过logcat和记录我在服务中生成的线程仍在运行并执行我想要的工作.

我甚至运行了一个adb shell dumpsys电源,发现我的唤醒锁定了refcount = 0,这表明一个不同的应用程序没有为我拿着唤醒锁.

我真的很幸运,我的服务似乎在没有唤醒锁的情况下在后台运行得很好吗?

编辑: 当连接到USB和从USB分离时,设备已显示此行为.我定期将我收集的数据上传到服务器并运行测试,我从不插入设备并让屏幕锁定整个测试,我仍然看到我的线程运行和数据上传.

jus*_*uke 4

您并不“幸运”,因为您的服务在没有唤醒锁的情况下也很好。您的设备从未休眠过。

如果您已连接 USB 并供电,那么您的设备将不会休眠。毕竟,如果您有现成的电源可供使用,那么节省电力有什么意义呢?

您需要使用 adb over IP (adb connect ) 连接到您的设备,然后从那里执行 logcat 以查看是否仍然观察到预期的日志。

编辑:忘记实际回答问题。

如果您希望您的服务不断地执行操作,那么您需要保持唤醒锁。请记住,永久保持唤醒锁基本上是移动编程中的第一罪。你永远不应该保持永久唤醒锁

由于您的服务正在跟踪数据使用情况,因此不需要唤醒锁,因为如果设备正在睡眠,则无需记录数据。

编辑2:让我们实验一下!

嗯。睡眠很难强迫,所以让我们直接进入核心选项。

  1. 修改您的代码,以便您不实际上传数据,而是存储一些元数据来告诉您您将在特定时间戳存储数据。另外,修改您的代码,以便您可以跟踪电源事件并为其添加时间戳。如果可以的话,将所有这些数据保存在内存中,这样我们就不会运行太多的系统代码。

  2. 将手机调至飞行模式。没错,关闭所有外部连接。另外,不要使用 ADB 或 logcat 或类似的东西。

  3. 杀死所有非必要的应用程序。卸载最好。

  4. 像使用 UI 的用户一样运行您的服务。请勿使用任何类型的测试;测试可能会妨碍睡眠(在 Android 上很难确定任何事情,因为睡眠是 OEM 的事情)。

  5. 稍等片刻。

  6. 转储带有时间戳的内存日志。即使它能告诉您您已经睡着了,您也可能无法获得有关睡眠发生时间的准确数据。但是,当您转换回刚刚所处的状态时,您应该能够从奇数功率事件顺序中推断出它。

  • 我最终做了一个长时间运行的测试,我尝试在拔掉手机、锁定屏幕的情况下运行一项服务,并每分钟上传一次数据。我发现,在 48 小时内,有时设备会按照我的预期运行(每分钟上传),有时会等待一个小时才上传。这证实了我肯定需要一个唤醒锁来实现一致的性能,但是这很令人困惑,因为它不是全部或全部,它是间歇性的,很难诊断出实际上有什么问题。 (5认同)