Android 是安卓';Wakelock是后台服务的必需品吗?

Android 是安卓';Wakelock是后台服务的必需品吗?,android,android-service,wakelock,android-wake-lock,Android,Android Service,Wakelock,Android Wake Lock,我正在编写一个长期运行的后台服务,用于收集和分析设备数据。为此,我启动一个服务,该服务生成一个线程,该线程进行数据收集/分析 从我的阅读中,我了解到,如果我希望服务在屏幕锁定/设备处于睡眠状态时执行它的操作,那么我应该使用部分唤醒锁来确保cpu在服务线程运行时不会进入睡眠状态。然而,我真的对此感到困惑,因为我目前没有使用wakelock,我可以通过任务管理器对我的应用程序进行后台设置、锁定屏幕或关闭应用程序,每次我这样做时,我都可以通过logcat和Log语句观察到我在服务中生成的线程仍在运行,

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

从我的阅读中,我了解到,如果我希望服务在屏幕锁定/设备处于睡眠状态时执行它的操作,那么我应该使用部分唤醒锁来确保cpu在服务线程运行时不会进入睡眠状态。然而,我真的对此感到困惑,因为我目前没有使用wakelock,我可以通过任务管理器对我的应用程序进行后台设置、锁定屏幕或关闭应用程序,每次我这样做时,我都可以通过logcat和Log语句观察到我在服务中生成的线程仍在运行,并且正在完成我想要的工作对

我甚至运行了一个adb shell dumpsys power,发现wakelocks的refcount=0,这向我表明另一个应用程序没有为我保存wakelock

我是不是很幸运,我的服务在没有唤醒锁的情况下在后台运行得很好

编辑: 当连接到USB和从USB断开时,设备表现出这种行为。我定期将收集到的数据上传到服务器,并运行了一些测试,在这些测试中,我从未插入设备,在整个测试过程中都将屏幕锁定,但我仍然看到我的线程在运行,数据也在上传。

如果没有唤醒锁,您的服务就可以正常运行,这并不“幸运”。你的设备从不睡觉

如果您已连接USB并提供电源,则您的设备将无法睡眠。毕竟,如果你有现成的电源可供使用,那么节电又有什么意义呢

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

编辑:忘记回答问题了

如果你想让你的服务不断地做一些事情,那么你需要保持一个唤醒锁。请记住,在移动编程中,永久保持wakelock基本上是罪过。你应该永远不要保持永久的唤醒锁定

由于您的服务正在跟踪数据使用情况,因此不需要wakelock,因为如果设备处于睡眠状态,则不需要记录任何数据

编辑2:让我们做个实验吧

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

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

  • 将手机置于飞行模式。没错,关闭所有外部连接。另外,不要使用ADB或logcat之类的工具

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

  • 像用户使用UI一样运行服务。不要使用任何类型的测试;测试可能会阻止睡眠(在Android上很难确定任何事情,因为困倦是一种原始设备制造商的事情)

  • 等一会儿

  • 用时间戳转储内存中的日志。如果它能告诉你你睡着了,你可能无法得到关于睡眠发生时间的准确数据。但是,当您转换回刚才所处的状态时,您应该能够从奇数幂事件顺序推断它


  • 您是在连接USB电缆的情况下进行此操作的吗?@addy2012我在连接到USB并从USB断开时看到此行为。我编辑了我的问题以包含更多信息。无论我是否连接到USB,我都会看到这种行为。我已经运行了一整天的测试,直到设备放在桌子上,没有在屏幕关闭的情况下插入任何东西。只要设备有电池,我的后台服务就会按预期启动并上传数据。(但谢谢你提供有关USB的提示,我没有想到这会混淆我的结果)。用一个你可以尝试的实验编辑了我的答案。在这一点上,它可能是一个OEM错误或您正在做的事情,这会阻止系统认为它处于可睡眠状态。睡眠是复杂的,因为几乎所有的“我能睡觉吗?”输入对用户都是不可见的。当然,除了那些显而易见的测试外,我还做了一个长时间的测试,我试图在手机拔下插头、屏幕锁定的情况下运行一项服务,并每分钟上传一次数据。我发现,在48小时内,有时设备会按照我的预期运行(每分钟上传一次),而在其他时间,它会等待一小时后再上传。这证实了我确实需要一个wakelock来实现一致的性能,但是这很令人困惑,因为它不是全部或全部,它是间歇性的,并且很难诊断是否确实有问题。这就是android睡眠状态:/。很高兴看到你明白了。