Итак, у меня есть BroadcastReceiver и AlarmManager.AlarmManager не всегда выполняет BroadcastReceiver
Скажем, я создаю Pending Intents так:
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, и он не надежно просыпается и по телефону. Наверное, это действительно ошибка, а не моя вина. Наверное, я буду придерживаться решения блокировки следа.
Какая ценность 'showAt'? –
Oups извините, исправлено. Он должен был быть «time1». Приложение в основном показывает диалог (в прозрачной активности) через некоторое время, когда экран погас (здесь 10 секунд) и спрятал его снова, если экран был слишком длинным (здесь 10 + 60 = 70 секунд). – flxapps
Теперь я решил проблему, получив блокировку следа: 'wakeLock.acquire (time2 - now + 5000);' (поддержание пробуждения телефона для - в верхнем примере - 70 секунд плюс 5 секунд в качестве буфера) - Однако я чувствую, что это довольно хакерское решение. Как вы думаете? Является ли это законным или слишком грязным, что может вызвать проблемы? – flxapps