wakelock + handler会让设备保持清醒吗?

时间:2017-12-21 05:53:15

标签: android android-intent android-service wakelock powermanager

我目前正在开发一款应用程序,使用Handler& amp ;;每30分钟启动一次活动。唤醒锁定。但我想知道这种方法的可靠性。我确实检查了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。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

由于Doze模式,从Android 6.0(API 23)开始,此方法无法正常工作。当设备处于空闲状态且处于Doze状态时,将忽略唤醒锁定。从API 26开始,这将获得更多限制,并且不允许后台服务自由运行。

经常醒来通常是个坏主意,除非用户正在积极使用您的应用程序并且知道操作(因此新的背景限制)。请查看使用JobScheduler来处理例行后台任务(虽然在Doze模式中也有限制。)