唤醒锁 + 处理程序是否允许设备保持唤醒状态?



我目前正在开发一个应用程序,该应用程序使用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,Google Pixel XL和Nexus 6P。

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

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

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

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

最新更新