0

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

    @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、谷歌 Pixel XL 和 Nexus 6P。

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

4

2 回答 2

0

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

于 2017-12-21T13:00:58.527 回答
0

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

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

于 2017-12-21T14:05:55.547 回答