Я решил задать этот вопрос после исследования почти 3 недели.В качестве бизнес-требования я должен постоянно поддерживать фоновый сервис в приложении для Android.
Требование таково, что мое приложение имеет только одно фоновое обслуживание и оно должно постоянно искать устройства BLE. (Не волнуйтесь, я настроил медленный режим сканирования, когда не установлено устройство BLE, в котором я приостанавливаю и возобновляю сканирование). Приложение не для всех, поскольку оно предназначено для некоторой проверки подлинности с устройствами BLE, когда вы попадаете в зону действия. Надеюсь, это установит ВАЖНОСТЬ обслуживания, работающего все время. Я не могу использовать foreground service (бизнес-требование).
Всякий раз, когда андроид убивает мое обслуживание, onDestroy()
не вызывается. Поэтому лучше всего использовать диспетчер аварийных сигналов, который запускается каждые 5 минут и проверяет, убита ли служба, и если она была убита, она вызывает startService()
. Тревожные сигналы срабатывают в течение некоторого времени, но после случайных периодов (1, 2 3 часа) даже сигнал тревоги убивается, и он больше не срабатывает.
Я отправляю широковещательную рассылку через будильник, чья onReceive()
несет ответственность за запуск службы, если она была убита. У меня нет обходных путей, может ли кто-нибудь объяснить или предложить, почему диспетчер аварийной сигнализации неисправен после некоторого случайного времени. В настоящее время я тестирую свое приложение на Nexus 6p, Galaxy s7 edge, Samsung A5, Huawei P9.
Может быть предоставлено любое объяснение.
Спасибо, что ответили. Завтра я буду проверять с помощью adb, если на самом деле существует тревога. Как можно использовать 'setAndAllowWhileIdle()' и получать сигнал тревоги каждые 5 минут? И о «WakeLock» я приобрел его в 'onReceive()' моего широковещательного приемника и после вызова 'startService()' я его выпустил. Разве это не так? – madking
@madking: «Как может использовать setAndAllowWhileIdle() и получать сигнал тревоги каждые 5 минут?» - Ты не можешь. Я думаю, что рекламируемый минимальный период составляет 9 минут, и это может быть даже не так часто. «Разве это не так?» - это означает, что ваш «WakeLock» приобретается примерно в микросекунду. 'startService()' является асинхронным; служба не запускается, когда 'startService()' возвращается. Я бы ожидал, что вашему сервису понадобится 'WakeLock', чтобы он выполнял свою работу в любом случае, поэтому пользователи могут быть недовольны вашим приложением. – CommonsWare
Плюс Я использую 'RTC_WAKEUP', и у меня есть уведомление, выпущенное в' onReceive() ', поэтому независимо от того, запущена или нет служба или телефон находится в режиме DOZE (представлен на Android 6), уведомление должно отображаться всякий раз тревога срабатывает, когда он просыпает процессор в течение очень короткого момента. Но уведомления перестают появляться через некоторое время. – madking