我目前正在开发一个应用程序,它使用Handler和WakeLock每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。
我发现这耗尽了大量的电池。有更环保的解决方案吗?
由于Doze模式,从Android 6.0(API 23)开始,此方法无法正常工作。当设备处于空闲状态且处于Doze状态时,将忽略唤醒锁定。从API 26开始,这将获得更多限制,并且不允许后台服务自由运行。
除非用户正在积极使用您的应用程序并且知道操作(因此新的背景限制),否则经常醒来通常是个坏主意。查看使用JobScheduler
来处理日常后台任务(尽管也有限制)在打盹模式。)
是的,它会的。如果你想使用wakefulBroadcast,你必须通过startWakefulService()使用Service,并在完成你的工作后你必须释放唤醒锁。 https://developer.android.com/training/scheduling/wakelock.html但最有效的方法是使用JobScheduler和JobServices来开始您的活动。