#android #alarmmanager
#Android #alarmmanager
Вопрос:
Я наблюдал некоторые странные проблемы при использовании диспетчера сигналов тревоги в Android, несмотря на то, что я использую RTC (без пробуждения), телефон будет надежно отправлять PendingIntents с правильными повторяющимися интервалами.
Подробности моего теста
- Устройство не заряжается, просто лежит на моей тумбочке, пока я спал
- Мой сервис каждый раз просыпался с интервалом повторения (30 минут, я знаю экстремальный показатель)
- Служба регистрировала свою активность в файле, чтобы я мог прочитать его утром
Теперь, насколько я понимаю, телефон должен находиться в спящем режиме, если я его не разбужу, и мои сигналы тревоги не должны отправляться до тех пор, пока телефон не будет включен.
- Почему моя служба выполнялась?
- Если другая служба ведет себя неправильно и использует _WAKEUP варианты будильника, моя служба тоже проснется?
- Могу ли я избежать пробуждения другой службой и просто проснуться от того, что пользователь включает экран?
Ответ №1:
Почему моя служба выполнялась?
Предположительно, что-то еще заставляло устройство просыпаться в те моменты.
Если другая служба ведет себя неправильно и использует _WAKEUP варианты будильника, моя служба тоже проснется?
Да, хотя «неправильное поведение» бросается в глаза наблюдателю.
Могу ли я избежать пробуждения другой службой и просто проснуться от того, что пользователь включает экран?
Не напрямую через AlarmManager
. Вы можете отслеживать ACTION_SCREEN_OFF
и ACTION_USER_PRESENT
трансляции и, возможно, отключать свои сигналы тревоги между ними.
Комментарии:
1. Как насчет ограничений этих двух трансляций? Как вы отметили в своем отчете об ошибке code.google.com/p/android/issues/detail?id=10735 они не могут быть зарегистрированы в манифесте. Это нормально для действия, но поскольку я имею дело со службой, они по сути бесполезны и будут выпущены, когда служба умрет (быстро для IntentService). Трансляции также не являются липкими, поэтому я не могу запрашивать их по желанию. Я что-то упускаю? Могу ли я создать долговременный BroadcastReceiver из моего IntentService?
2. @smith324: «Как вы отметили в своем отчете об ошибке code.google.com/p/android/issues/detail?id=10735 они не могут быть зарегистрированы в манифесте «. — хм, да, верно. Извините, забыл об этом. 🙁 «Могу ли я создать долговременный BroadcastReceiver из моего IntentService?» — приложение
IntentService
не предназначено для «длительного использования».3. Ну, я думаю, я мог бы создать другую службу, которая прослушивает включение / выключение экрана, но это просто похоже на взлом и пустую трату ресурсов :
4. @smith324: Самое близкое, что я знаю о проверке по требованию, это
inKeyguardRestrictedInputMode()
включеноKeyguardManager
.5. Спасибо за это, похоже, это то, что мне нужно.
Ответ №2:
Я только что потратил час, пытаясь выяснить, почему мой RTC alarm отправляет PendingIntents, даже когда мой телефон находится в спящем режиме. И ответы очень просты, потому что он был подключен к USB, поэтому телефон имел статус «зарядка».
Предположительно, что-то еще заставляло устройство просыпаться в те моменты.
Множество приложений с рекламой уведомлений (например, AirPush, Leadbolt и т.д.) пробуждают устройство.