Android 的 Wakelock 是后台服务的必需品吗?
Is Android's Wakelock a necessity for background services?
我正在编写一个长期 运行ning 后台服务,用于收集和分析设备数据。为此,我启动了一个服务,该服务生成一个线程,该线程执行数据收集/分析。
根据我的阅读,我了解到如果我想让服务在屏幕锁定/设备休眠时执行它的操作,我应该使用部分唤醒锁来确保 cpu 不会在服务线程 运行ning 时进入休眠状态。但是我真的对此感到困惑,因为我目前没有使用唤醒锁并且能够通过任务管理器将我的应用程序设置为后台或锁定屏幕或终止应用程序,每次我这样做时我都可以通过 logcat 和日志声明我在服务中生成的线程仍在 运行 正在执行我想要的工作。
我什至 运行 一个 adb shell dumpsys power 并且发现我的唤醒锁的 refcount = 0 这向我表明一个不同的应用程序没有为我保留唤醒锁。
我的服务似乎 运行 在没有唤醒锁的情况下在后台运行良好,我只是幸运吗?
编辑:
设备在连接到 USB 和从 USB 断开时都表现出这种行为。我定期将收集到的数据上传到服务器并进行 运行 测试,我从不插入设备并在整个测试过程中锁定屏幕,但我仍然看到我的线程 运行s并上传数据。
你不是 "lucky" 你的服务没有唤醒锁就很好。您的设备从未休眠。
如果您已连接 USB 并供电,则您的设备将不会休眠。毕竟,如果您有现成的电源可供使用,那么省电有什么意义呢?
您需要使用 adb over IP (adb connect ) 连接到您的设备,然后从那里执行 logcat 以查看您是否仍然观察到预期的日志。
编辑:忘记实际回答问题了。
如果你想让你的服务不断地做事,那么你需要保持唤醒锁。请记住,永久保持唤醒锁基本上是移动编程中的第一罪过。您应该永远不要保持永久唤醒锁。
由于您的服务正在跟踪数据使用情况,因此不需要唤醒锁,因为如果设备处于休眠状态,则不会记录任何数据。
编辑 2:让我们试验一下!
嗯。睡眠难强,直接上核选项吧
修改您的代码,而不是实际上传数据,而是存储一些元数据以告诉您您将在特定时间戳存储数据。此外,修改您的代码,以便您可以跟踪电源事件并为其添加时间戳。如果可以,请将所有这些数据保存在内存中,这样我们就不会有太多的系统代码运行.
将您的 phone 设为飞行模式。没错,关闭所有外部连接。另外,不要使用 ADB 或 logcat 或类似的东西。
杀死所有非必要的应用程序。卸载最好
运行 您作为用户的服务将使用 UI。不要使用任何类型的测试;测试 可能 防止睡眠(在 Android 上很难确定任何事情,因为嗜睡是 OEM 的事情)。
稍等
转储带有时间戳的内存日志。如果它甚至会告诉您您睡过的话,您可能无法获得关于何时发生睡眠的准确数据。但是当你转换回你刚刚进入的状态时,你应该能够从奇数次幂事件排序中推断出它。
我正在编写一个长期 运行ning 后台服务,用于收集和分析设备数据。为此,我启动了一个服务,该服务生成一个线程,该线程执行数据收集/分析。
根据我的阅读,我了解到如果我想让服务在屏幕锁定/设备休眠时执行它的操作,我应该使用部分唤醒锁来确保 cpu 不会在服务线程 运行ning 时进入休眠状态。但是我真的对此感到困惑,因为我目前没有使用唤醒锁并且能够通过任务管理器将我的应用程序设置为后台或锁定屏幕或终止应用程序,每次我这样做时我都可以通过 logcat 和日志声明我在服务中生成的线程仍在 运行 正在执行我想要的工作。
我什至 运行 一个 adb shell dumpsys power 并且发现我的唤醒锁的 refcount = 0 这向我表明一个不同的应用程序没有为我保留唤醒锁。
我的服务似乎 运行 在没有唤醒锁的情况下在后台运行良好,我只是幸运吗?
编辑: 设备在连接到 USB 和从 USB 断开时都表现出这种行为。我定期将收集到的数据上传到服务器并进行 运行 测试,我从不插入设备并在整个测试过程中锁定屏幕,但我仍然看到我的线程 运行s并上传数据。
你不是 "lucky" 你的服务没有唤醒锁就很好。您的设备从未休眠。
如果您已连接 USB 并供电,则您的设备将不会休眠。毕竟,如果您有现成的电源可供使用,那么省电有什么意义呢?
您需要使用 adb over IP (adb connect ) 连接到您的设备,然后从那里执行 logcat 以查看您是否仍然观察到预期的日志。
编辑:忘记实际回答问题了。
如果你想让你的服务不断地做事,那么你需要保持唤醒锁。请记住,永久保持唤醒锁基本上是移动编程中的第一罪过。您应该永远不要保持永久唤醒锁。
由于您的服务正在跟踪数据使用情况,因此不需要唤醒锁,因为如果设备处于休眠状态,则不会记录任何数据。
编辑 2:让我们试验一下!
嗯。睡眠难强,直接上核选项吧
修改您的代码,而不是实际上传数据,而是存储一些元数据以告诉您您将在特定时间戳存储数据。此外,修改您的代码,以便您可以跟踪电源事件并为其添加时间戳。如果可以,请将所有这些数据保存在内存中,这样我们就不会有太多的系统代码运行.
将您的 phone 设为飞行模式。没错,关闭所有外部连接。另外,不要使用 ADB 或 logcat 或类似的东西。
杀死所有非必要的应用程序。卸载最好
运行 您作为用户的服务将使用 UI。不要使用任何类型的测试;测试 可能 防止睡眠(在 Android 上很难确定任何事情,因为嗜睡是 OEM 的事情)。
稍等
转储带有时间戳的内存日志。如果它甚至会告诉您您睡过的话,您可能无法获得关于何时发生睡眠的准确数据。但是当你转换回你刚刚进入的状态时,你应该能够从奇数次幂事件排序中推断出它。