Перезапуск службы Android не работает - PullRequest
2 голосов
/ 21 декабря 2011

Я создал сервис для трансляции данных таймера для различных действий.Обычно он работает нормально без проблем, но есть случаи, когда перезапуск Android не работает должным образом.

У него также есть три приемника вещания:

1 - Событие отключения экрана: для остановкиПередача данных таймера и установка будильника в alarmanager, когда служба заканчивается, поэтому я смогу воспроизводить уведомления о завершении для пользователей, которые будут присутствовать.

2 - Экран по событию: для продолжения передачи данных таймера,Я также отменяю любой ожидающий сигнал тревоги.

3 - Приемник для сигналов тревоги.Обычно это происходит, когда экран выключен, как описано в 1.

Моя служба запускается с startForeground и возвращает START_REDELIVER_INTENT.Так как у начального намерения есть начальная дата таймера, я могу воссоздать статус сервиса без проблем.Приемник широковещательной сигнализации и onStartCommand используют одну и ту же процедуру обработки дескрипторов для запуска или продолжения обслуживания.

Все это прекрасно работает.Для короткого таймера (<30 мин) я не нахожу никаких проблем.Экран может быть включен, выключен, изменить одно и то же время от включения до выключения и от выключения до включенияТакже деятельность может быть спереди или сзади.Я играю со всеми этими возможными состояниями.Во всех случаях моя служба и активность работают нормально. </p>

Мои проблемы возникают, когда какой-то таймер длиннее (> 30 минут, обычно я настраиваюсь на 35 минут).Иногда это может быть вызвано тем, что Android убивает меня.Это нормально, так как я понимаю, что Android делает это, чтобы улучшить пользовательский опыт.Проблема в том, что когда я захожу в «настройки / приложения / службы», я вижу свою службу в состоянии «перезапуск».Я подозреваю, что это означает, что Android еще не запустил его, и это запланировано.Это показывает это состояние в течение долгого времени (у меня не было пациента, чтобы сказать, если оно изменится больше, чем другие полчаса ....)

Проблема в том, что когда в этом состоянии, это может длиться вечно (Я смотрю на это, и служба никогда не запускается), таймер (в моих часах) достигает тайм-аута, диспетчер будильника запускает мои намерения, но так как моя служба еще не запущена и трансляция не зарегистрирована, я не могу сделатьперсонал для тайм-аутов (игровые уведомления).Таким образом, пользователь не знает, что сервисный таймер закончился, и это серьезная проблема.

Это очень буйно.Так как служба убита почти в любом прогоне, прошло 30 минут, в то время как другие службы не убиты.

Мой вопрос: что именно происходит?Как я могу правильно справиться с этой ситуацией, чтобы правильно определить срабатывание сигнализации или, что еще важнее: как заставить принудительно перезапустить службу?

Для добавления некоторых справочных данных:

  • Мой сервис имеет очень мало памяти по сравнению с другими, а также не выполняет длинные операции, он использует только handler.postdelayed ("sendUpdatesToUI", 250), когда экран включен, и ничего, когда экран выключен., только ожидание, что Аварийный менеджер отправит намерение истечения времени ожидания.

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

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

  • Когда служба отключена, onDestroy не вызывается.

  • Использование 2.3.4 версия.

1 Ответ

1 голос
/ 26 декабря 2011

После долгих исследований я нашел решение своей проблемы. Это все о функции startForeGround. Я использовал:

startForeground (0, нет);

, хотя это выглядит хорошо и встречается во многих примерах в Интернете, правильный способ сделать это - не 0, а любое другое случайное значение:

startForeground (2765, нет),

Это решит проблему.

...