Вопрос по android, alarmmanager – Android Developer - Менеджер тревог и сервис

7

Я делаю приложение, которое должно выполнять функцию каждый час, даже если приложение закрыто.

Прежде всего, я подумал о создании сервиса, но во время тестов я понял, что android иногда убивает мой сервис. Поэтому я искал другое решение и нашел AlarmManager. Я реализовал это, и это, кажется, работает, но у меня есть сомнения, если это произойдет, то же самое сервис или он будет работать вечно? (До перезагрузки мобильного ...)

Другой вопрос, нужно ли создавать новый поток для выполнения процесса в диспетчере аварий или он запускается непосредственно в другом потоке?

Ваш Ответ

2   ответа
6

и это, кажется, работает, но у меня есть сомнения, если это произойдет, то же самое сервис или он будет работать вечно? (До перезагрузки мобильного ...)

Это будет работать до:

устройство перезагружено, как вы заметили, илипользователь удаляет ваше приложение илиВы отменяете события самостоятельно, илипользователь заходит в настройки, находит ваше приложение в списке установленных приложений, нажимает на эту запись и нажимает кнопку принудительной остановки

Это'Возможно, после обновления вашего приложения необходимо будет снова планировать сигналы тревоги (я забыл ...).

необходимо создать новый поток для выполнения процесса в диспетчере аварий или он запускается непосредственно в другом потоке ??

Если работа, которую вы собираетесь выполнить, не займет всего пару миллисекунд, вам понадобится фоновый поток для нее. Это приводит к двум возможным моделям:

Если вы не используете_WAKEUPсигнализация, используйтеgetService() PendingIntent передать контрольIntentService каждый час

Если вы используете_WAKEUPбудильник, вам нужно будет использоватьgetBroadcast() PendingIntentи пусть он вызывает ваш подклассмойWakefulIntentServiceили вам нужно будет управлятьWakeLock себя, чтобы держать устройство в активном состоянии, пока вы выполняете свою работу

Кроме того, если вы хотите, чтобы он не останавливался после перезагрузки устройства, вы можете зарегистрировать его вmanifest сintent-filter изBOOT_COMPLETED поэтому он запустится снова после перезагрузки устройства codeMagic
@CommonsWare Есть ли альтернатива использованию alarmManager? Тот, который сможет справиться с такими особыми случаями? Использование службы может быть нехорошо, так как она может случайно закрыться (если толькоЭто приоритетный сервис, но это будет немного раздражать пользователя). android developer
@CommonsWare В случае обновления выигралПриложение будильника бесполезно, так как оно можетбыть автоматически включен? Я имею в виду, что вы написали, что после обновления alarmManager отменяет все, что связано с приложением, верно? о решениях для работы в фоновом режиме, есть ли у вас примеры кодов для каждого из них? android developer
@androiddeveloper: "Вы имеете в виду, что до API 12 сигналы тревоги не былиавтоматически удаляется после обновления? " - это мое предположение. CommonsWare
3

Android победилt убить запланированные тревоги, и они выполнялись как запланировано, если приложение не заменено или устройство не перезагружено. Используйте широковещательные приемники для этих событий, чтобы перепланировать Будильники. Там'Нельзя предотвратить Force Stop, поскольку он полностью убивает все компоненты и потоки приложения.

Это зависит от того, что делает Alarm Manager. Если он отправляет широковещательную рассылку, ограничение получателя составляет 10 секунд.

Если он запускает активность, службу или намеренную службу, ограничений нет. Для Активности и Сервисов вы должны завершить или остановить его, а для Сервисов по намерениям до завершения процесса. Знайте, что вы можетев Intent Service нет другого потока, и выr ограничен кодом внутри OnHandleIntent.

Также вы должны учитывать состояние устройства. Если оно's спать, и вы используете Wake Up флаг получателей выигралне нужен замок для пробуждения, но другие нужны. Это победилоустройство долго не ложится спать.

Дон»трать системные ресурсы с помощью службы, потому что Alarm Manager делает то, что вы хотите.

Похожие вопросы