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

标签 android android-service wakelock android-wake-lock

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

从我的阅读中我了解到,如果我希望服务在屏幕锁定/设备正在休眠时执行它的操作,我应该使用部分唤醒锁来确保 cpu 在服务停止时不会进入休眠状态线程正在运行。但是我真的对此感到困惑,因为我目前没有使用唤醒锁并且能够通过任务管理器将我的应用程序设置为后台或锁定屏幕或终止应用程序,每次我这样做时我都能够通过 logcat 和记录我在服务中生成的线程仍在运行并执行我希望它执行的工作的日志语句。

我什至运行了 adb shell dumpsys power,发现唤醒锁的 refcount = 0,这向我表明另一个应用程序没有为我持有唤醒锁。

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

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

最佳答案

您的服务在没有唤醒锁的情况下也能正常运行,这可不是“幸运的”。您的设备从未休眠。

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

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

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

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

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

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

嗯。 sleep 很难强制,所以让我们直接进入核选项。

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

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

  3. 关闭所有不必要的应用程序。最好卸载。

  4. 以用户使用 UI 的方式运行您的服务。不要使用任何类型的测试;测试可能防止 sleep (由于 sleep 是 OEM 的事情,因此很难在 Android 上确定任何事情)。

  5. 请稍等。

  6. 导出带有时间戳的内存日志。如果它甚至会告诉您您睡过的话,您可能无法获得关于何时发生 sleep 的准确数据。但是当您转换回您刚刚处于的状态时,您应该能够从奇数次幂事件排序中推断出它。

关于android - Android 的 Wakelock 是后台服务的必需品吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30023305/

相关文章:

java - Android:获取通知的唯一ID

android - 由于数字 Assets 链接,Google Play 不接受即时应用

android - 带有 map 自定义 fragment 的 Robolectric 3.0 InflateException

java - 如何测试 InputMethodService

android - 当不使用广播接收器来处理从警报管理器发送的 IntentServices 时,我是否需要获取唤醒锁?

android - 将应用程序置于最前面,打开显示并从 AlarmManager 解锁?

android - Turbolinks 5 和 Android : Fails when use file upload (webview)

android - 如何在 Android 中重启设备后启动服务

android - 为什么 BroadcastReceiver 不起作用?

java - Android:我应该避免在 Commonsware 的 WakefulIntentservice 中使用自己编写的方法吗?