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

前端之家收集整理的这篇文章主要介绍了Android的Wakelock是后台服务的必需品吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在编写一个长期运行的后台服务,用于收集和分析设备数据.为此,我启动一项服务,该服务生成一个线程,该线程进行数据收集/分析.

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

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

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

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

解决方法

如果没有唤醒锁,你的服务没那么“幸运”.你的设备从不睡觉.

如果您已连接USB并供电,则您的设备将无法进入睡眠状态.毕竟,如果您准备好供应它,那么节省电力的重点是什么?

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

编辑:忘了真正回答这个问题.

如果您希望您的服务不断进行,那么您需要保留一个唤醒锁.请记住,永久保留唤醒锁定在移动编程中基本上是罪恶#1.你永远不应该永远保持WAKELOCK.

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

编辑2:我们来试验吧!

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

>修改代码,以便不是实际上传数据,而是存储一些元数据,告诉您将在特定时间戳存储数据.此外,修改您的代码,以便您可以跟踪电源事件并为它们添加时间戳.如果可以,请将所有这些数据保存在内存中,以便我们不会运行太多系统代码.
>将手机置于飞行模式.没错,关闭所有外部连接.另外,不要使用ADB或logcat或类似的东西.
>杀死所有非必要的应用程序.卸载是最好的.
>以用户使用UI的方式运行您的服务.不要使用任何排序的测试;测试可以防止睡眠(因为困倦是OEM的事情,所以在Android上很难知道任何事情).>等一会儿.>使用时间戳转储内存中的日志.你可能无法获得关于睡眠何时发生的准确数据,如果它甚至会告诉你你睡了.但是当你转换回你刚刚进入的状态时,你应该能够从奇怪的权力事件排序中推断它.

猜你在找的Android相关文章