Перевод телефона в спящий режим при использовании RTC alarm на Android

#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 и т.д.) пробуждают устройство.