wakelock + handler 会让设备保持唤醒状态吗?

Will wakelock + handler allow the device to stay awake?

我目前正在开发一个应用程序,该应用程序使用 Handler 和 WakeLock 每 30 分钟启动一次 activity。但我想知道这种方法的可靠性。我确实检查了 this post,但它似乎没有回答我的问题。 这是我用来保持服务正常运行的代码 运行:

    @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "MyWakelockTag");
    wakeLock.acquire();
    final Runnable runnable = new Runnable() {
        @Override
        public void run() {
            Intent sendMessage = new Intent();
            sendMessage.setAction(LAWAY);
            sendMessage.setClass(LAWAYService.this, LReceiver.class);
            sendBroadcast(sendMessage);
        }
    };
    handler.postDelayed(runnable, DURATION);
    return START_STICKY;
}

这有多可靠?我将它与 WakefulBroadcastReceiver 结合使用。到目前为止,它可以与我测试过的三款设备一起使用,包括三星 Galaxy Note 5、Google Pixel XL 和 Nexus 6P。

我发现这会耗尽大量电池电量。有没有更环保的解决方案?

是的,会的。 如果你想使用 wakefulBroadcast,你必须通过 startWakefulService() 使用 Service 并且在完成你的工作后你必须释放唤醒锁。 https://developer.android.com/training/scheduling/wakelock.html 但最有效的方法是使用 JobScheduler 和 JobServices 来启动你的 activity.

由于 Doze 模式,从 Android 6.0 (API 23) 开始,此方法将无法可靠运行。当设备空闲并处于 Doze 模式时,唤醒锁将被忽略。从 API 26 开始,这会变得更加严格,不允许后台服务自由 运行。

通常来说,经常醒来是个坏主意,除非用户正在积极使用您的应用程序并且知道该操作(因此有新的背景限制。)考虑使用 JobScheduler 来处理日常事务后台任务(尽管在打瞌睡模式下也会有限制。)