Android 是安卓';Wakelock是后台服务的必需品吗?
我正在编写一个长期运行的后台服务,用于收集和分析设备数据。为此,我启动一个服务,该服务生成一个线程,该线程进行数据收集/分析 从我的阅读中,我了解到,如果我希望服务在屏幕锁定/设备处于睡眠状态时执行它的操作,那么我应该使用部分唤醒锁来确保cpu在服务线程运行时不会进入睡眠状态。然而,我真的对此感到困惑,因为我目前没有使用wakelock,我可以通过任务管理器对我的应用程序进行后台设置、锁定屏幕或关闭应用程序,每次我这样做时,我都可以通过logcat和Log语句观察到我在服务中生成的线程仍在运行,并且正在完成我想要的工作对 我甚至运行了一个adb shell dumpsys power,发现wakelocks的refcount=0,这向我表明另一个应用程序没有为我保存wakelock 我是不是很幸运,我的服务在没有唤醒锁的情况下在后台运行得很好 编辑: 当连接到USB和从USB断开时,设备表现出这种行为。我定期将收集到的数据上传到服务器,并运行了一些测试,在这些测试中,我从未插入设备,在整个测试过程中都将屏幕锁定,但我仍然看到我的线程在运行,数据也在上传。如果没有唤醒锁,您的服务就可以正常运行,这并不“幸运”。你的设备从不睡觉 如果您已连接USB并提供电源,则您的设备将无法睡眠。毕竟,如果你有现成的电源可供使用,那么节电又有什么意义呢 您需要使用adb over IP(adb connect)连接到您的设备,然后从那里执行logcat,以查看您是否仍然遵守预期的日志 编辑:忘记回答问题了 如果你想让你的服务不断地做一些事情,那么你需要保持一个唤醒锁。请记住,在移动编程中,永久保持wakelock基本上是罪过。你应该永远不要保持永久的唤醒锁定 由于您的服务正在跟踪数据使用情况,因此不需要wakelock,因为如果设备处于睡眠状态,则不需要记录任何数据 编辑2:让我们做个实验吧 嗯,睡眠是很难强迫的,所以让我们直接进入核选项Android 是安卓';Wakelock是后台服务的必需品吗?,android,android-service,wakelock,android-wake-lock,Android,Android Service,Wakelock,Android Wake Lock,我正在编写一个长期运行的后台服务,用于收集和分析设备数据。为此,我启动一个服务,该服务生成一个线程,该线程进行数据收集/分析 从我的阅读中,我了解到,如果我希望服务在屏幕锁定/设备处于睡眠状态时执行它的操作,那么我应该使用部分唤醒锁来确保cpu在服务线程运行时不会进入睡眠状态。然而,我真的对此感到困惑,因为我目前没有使用wakelock,我可以通过任务管理器对我的应用程序进行后台设置、锁定屏幕或关闭应用程序,每次我这样做时,我都可以通过logcat和Log语句观察到我在服务中生成的线程仍在运行,
您是在连接USB电缆的情况下进行此操作的吗?@addy2012我在连接到USB并从USB断开时看到此行为。我编辑了我的问题以包含更多信息。无论我是否连接到USB,我都会看到这种行为。我已经运行了一整天的测试,直到设备放在桌子上,没有在屏幕关闭的情况下插入任何东西。只要设备有电池,我的后台服务就会按预期启动并上传数据。(但谢谢你提供有关USB的提示,我没有想到这会混淆我的结果)。用一个你可以尝试的实验编辑了我的答案。在这一点上,它可能是一个OEM错误或您正在做的事情,这会阻止系统认为它处于可睡眠状态。睡眠是复杂的,因为几乎所有的“我能睡觉吗?”输入对用户都是不可见的。当然,除了那些显而易见的测试外,我还做了一个长时间的测试,我试图在手机拔下插头、屏幕锁定的情况下运行一项服务,并每分钟上传一次数据。我发现,在48小时内,有时设备会按照我的预期运行(每分钟上传一次),而在其他时间,它会等待一小时后再上传。这证实了我确实需要一个wakelock来实现一致的性能,但是这很令人困惑,因为它不是全部或全部,它是间歇性的,并且很难诊断是否确实有问题。这就是android睡眠状态:/。很高兴看到你明白了。