即使经过大量研究,我仍然不能完全确定我如何实现由WakeLock
aService
开始的 a 的BroadcastReceiver
方式是否正确 - 即使它似乎工作正常。广播接收器从警报中获取发送给它的意图,因此首先从以下 API 文档开始AlarmManager
:
如果您的警报接收器调用了 Context.startService(),则手机可能会在请求的服务启动之前休眠。为防止这种情况,您的 BroadcastReceiver 和 Service 将需要实施单独的唤醒锁定策略,以确保手机继续运行直到服务可用。
所以,在onReceive()
我做:
Intent serviceIntent = new Intent(context, SomeService.class);
context.startService(serviceIntent);
if(SomeService.wakeLock == null) {
PowerManager powerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
SomeService.wakeLock = powerManager.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK,
SomeService.WAKE_LOCK_TAG);
}
if(! SomeService.wakeLock.isHeld()) {
SomeService.wakeLock.acquire();
}
在我做的服务中:
try {
// Do some work
} finally {
if(wakeLock != null) {
if(wakeLock.isHeld()) {
wakeLock.release();
}
wakeLock = null;
}
}
该SomeService.wakeLock
字段是包私有的、静态的和易失的。
我不确定使用的是检查isHeld()
- 它是否真的告诉我是否WakeLock
获得了 a ,我是否需要进行此检查?