2016-12-21 2 views
2

Я решил задать этот вопрос после исследования почти 3 недели.В качестве бизнес-требования я должен постоянно поддерживать фоновый сервис в приложении для Android.

Требование таково, что мое приложение имеет только одно фоновое обслуживание и оно должно постоянно искать устройства BLE. (Не волнуйтесь, я настроил медленный режим сканирования, когда не установлено устройство BLE, в котором я приостанавливаю и возобновляю сканирование). Приложение не для всех, поскольку оно предназначено для некоторой проверки подлинности с устройствами BLE, когда вы попадаете в зону действия. Надеюсь, это установит ВАЖНОСТЬ обслуживания, работающего все время. Я не могу использовать foreground service (бизнес-требование).

Всякий раз, когда андроид убивает мое обслуживание, onDestroy() не вызывается. Поэтому лучше всего использовать диспетчер аварийных сигналов, который запускается каждые 5 минут и проверяет, убита ли служба, и если она была убита, она вызывает startService(). Тревожные сигналы срабатывают в течение некоторого времени, но после случайных периодов (1, 2 3 часа) даже сигнал тревоги убивается, и он больше не срабатывает.

Я отправляю широковещательную рассылку через будильник, чья onReceive() несет ответственность за запуск службы, если она была убита. У меня нет обходных путей, может ли кто-нибудь объяснить или предложить, почему диспетчер аварийной сигнализации неисправен после некоторого случайного времени. В настоящее время я тестирую свое приложение на Nexus 6p, Galaxy s7 edge, Samsung A5, Huawei P9.

Может быть предоставлено любое объяснение.

ответ

2

Тревожные сигналы срабатывают в течение некоторого времени, но после случайных раз (1, 2 3 часа) даже сигнал тревоги будет убит, и он больше не срабатывает.

Если adb shell dumpsys alarm не показывает вашу тревогу, вы можете сказать, что «будильник был убит». Обычно этого не происходит, если пользователь не использует Force Stop в настройках.

Однако, скорее всего, сам сигнал тревоги. Однако устройство перешло в Doze mode, и поэтому ваши тревоги будут игнорироваться. Ваши варианты:

  • Попробуйте setAndAllowWhileIdle(), которые не могут быть отправлены так часто, как вы хотели бы, или

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

  • Попросите пользователя держать устройство включенным все время, имея в виду, что пользователи могут выбрать, чтобы не делать этого

Я посылаю радиопередачу thrugh тревоги которого OnReceive() отвечает за запуск службы, если он будет убит

Если вы не используете WakeLock (тщательно), существует вероятность того, что устройство заснет, прежде чем ваш сервис начнется.

+0

Спасибо, что ответили. Завтра я буду проверять с помощью adb, если на самом деле существует тревога. Как можно использовать 'setAndAllowWhileIdle()' и получать сигнал тревоги каждые 5 минут? И о «WakeLock» я приобрел его в 'onReceive()' моего широковещательного приемника и после вызова 'startService()' я его выпустил. Разве это не так? – madking

+0

@madking: «Как может использовать setAndAllowWhileIdle() и получать сигнал тревоги каждые 5 минут?» - Ты не можешь. Я думаю, что рекламируемый минимальный период составляет 9 минут, и это может быть даже не так часто. «Разве это не так?» - это означает, что ваш «WakeLock» приобретается примерно в микросекунду. 'startService()' является асинхронным; служба не запускается, когда 'startService()' возвращается. Я бы ожидал, что вашему сервису понадобится 'WakeLock', чтобы он выполнял свою работу в любом случае, поэтому пользователи могут быть недовольны вашим приложением. – CommonsWare

+0

Плюс Я использую 'RTC_WAKEUP', и у меня есть уведомление, выпущенное в' onReceive() ', поэтому независимо от того, запущена или нет служба или телефон находится в режиме DOZE (представлен на Android 6), уведомление должно отображаться всякий раз тревога срабатывает, когда он просыпает процессор в течение очень короткого момента. Но уведомления перестают появляться через некоторое время. – madking