2011-12-21 4 views
2

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

Он также имеет три радиовещательных приемников:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ответ

1

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

startForeground (0, not);

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

startForeground (2765, нет),

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