Даже после многих исследований я все еще не совсем уверен, правильно ли реализуется WakeLock
для Service
, начинающийся с BroadcastReceiver
, даже если он работает нормально. Приемник вещания получает намерения, отправленные ему из тревоги, поэтому для начала из документов API AlarmManager
:
Если ваш приемник сигналов тревоги называется Context.startService(), это возможно что телефон будет спать до запуска запрошенной службы. к это позволит вашему BroadcastReceiver и Службе выполните отдельную политику блокировки слежения, чтобы убедиться, что телефон продолжает работать до тех пор, пока услуга не станет доступной.
Итак, в 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
или нет, и нужно ли вообще делать эту проверку?