Итак, у меня есть BroadcastReceiver и AlarmManager.
Предположим, что я создаю ожидающие намерения так:
Intent i;
i = new Intent(context, MyReceiver.class);
i.setAction(MyReceiver.ACTION_1);
i.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
pendingIntent1 = PendingIntent.getBroadcast(context, 1, i, PendingIntent.FLAG_UPDATE_CURRENT);
i = new Intent(context, MyReceiver.class);
i.setAction(MyReceiver.ACTION_2);
i.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
pendingIntent2 = PendingIntent.getBroadcast(context, 2, i, PendingIntent.FLAG_UPDATE_CURRENT);
И планируйте такие сигналы следующим образом:
now = SystemClock.elapsedRealtime();
long time1 = now + 10 * 1000;
long time2 = time1 + 60 * 1000;
am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, time1, pendingIntent1);
am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, time2, pendingIntent2);
Теперь я чувствую, что мой широковещательный приемник получает трансляцию для ACTION_1
достаточно надежно, а ACTION_2
часто не доставляется. Поэтому onReceive
редко или никогда не выполняется с намерением, содержащим действие ACTION_2
. Как это получается? Я думал, *_WAKEUP
гарантирует, что трансляции будут доставлены в любом случае?
[Обновление 09/15/2015]
- В целях тестирования я пытаюсь распечатать сообщение журнала в моем методе onReceive
. Все еще не работает.
- Я попытался использовать setExact в AlarmManager сейчас. Все еще не работает.
- Я даже пытался использовать WakefulBroadcastReceiver
. Все еще не работает.
- Однако я обнаружил, что устройство надежно просыпается, когда заряжается в заряженном состоянии.
Что может вызвать эту проблему?. Я читал везде, что широковещательные приемники гарантированно исполняются, если они запускаются диспетчером аварийных сообщений через ожидающее намерение (и не делают слишком много вещей в onReceive
). Возможно, у меня есть какая-то агрессивная политика энергосбережения на моем телефоне, с которой я не могу работать (без приобретения длинного замка следа, см. Комментарии)?
[Обновлено 09/19/2015] Я только что протестировал приложение для будильника (https://play.google.com/store/apps/details?id=com.alarmclock.xtreme.free) в Google Play, и он не надежно пробуждает телефон, слишком. Наверное, это действительно ошибка, а не моя вина. Я буду придерживаться решения блокировки слежения, я думаю.