2010-07-21 4 views
21

У нас есть Сервис, который непрерывно собирает данные датчика на телефоне. Эта служба должна работать «навсегда», например. до тех пор, пока пользователь хочет, и не будет убит системой.Android-сервис убит с "no longer want" - как его перезапустить?

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

В любом случае, моя проблема заключается в том, что служба может быть убита через некоторое время. Иногда через час, иногда только после 7 часов 10 часов.

Записи журнала, когда служба убита, выглядят следующим образом. Он просто говорит: «больше не хочет», иногда даже не звонив наDestroy(), насколько я могу судить.

07-20 17:07:11.593 I/ActivityManager( 85): No longer want my.project.datalogging (pid 23918): hidden #16 
07-20 17:07:11.593 I/WindowManager( 85): WIN DEATH: Window{44c61570 my.project.datalogging/my.project.datalogging.DataLoggingApp paused=false} 
07-20 17:07:11.603 I/BackgroundService(23925): onDestroy() 

Или позже (после того, как я вручную перезапустить его):

07-20 19:00:49.677 I/ActivityManager( 85): No longer want my.project.datalogging:BackgroundService (pid 24421): hidden #17 
07-20 19:00:49.677 I/ActivityManager( 85): No longer want my.project.datalogging (pid 24415): hidden #18 
07-20 19:00:49.807 85 10707 I WindowManager: WIN DEATH: Window{44f1ea58 my.project.datalogging/my.project.datalogging.DataLoggingApp paused=false} 

Я часто вижу другие услуги, которые убили с «больше не хотят», а затем сразу же возобновляется "планирования перезагрузки разбился услуги ". Например, здесь с подмастерьем:

07-20 17:30:45.503 I/ActivityManager( 85): No longer want com.fitnesskeeper.runkeeper (pid 24090): hidden #16 
07-20 17:30:45.603 W/ActivityManager( 85): Scheduling restart of crashed service com.fitnesskeeper.runkeeper/.services.RunKeeperService in 5000ms 
07-20 17:33:52.989 I/ActivityManager( 85): Start proc com.fitnesskeeper.runkeeper for service com.fitnesskeeper.runkeeper/.services.RunKeeperService: pid=24292 uid=10099 gids={3003, 1015} 

В журналах нет записей о низкой памяти. Тестирование выполняется на (несколько) Nexus One с 2.2 (Froyo FRF91).

Можно ли каким-либо образом добиться такого поведения с моим приложением? Автоматический перезапуск после его убийства?

Или это что-то совершенно другое, что просто похоже на logcat?

Если вам нужна дополнительная информация, просто спросите, и я постараюсь, чтобы обеспечить его :-)

ответ

12

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

+0

Спасибо за ваш ответ. Мы не используем startForeground(), но это кажется хорошей идеей. Я реализовал его, и в настоящее время я тестирую его, если он hels. Это может занять некоторое время, так как служба уже смогла выжить несколько часов, не убившись. – pableu

+0

Я не уверен, есть ли стандартный способ Android, гарантирующий, что служба остается на прежнем уровне, при работе в Java-пространстве (отдельная служба сторожевого таймера, которая периодически запускается и проверяется на вашем сервисе все еще вверх?). Если нет, вам может потребоваться спуститься в слой NDK и Linux ... –

+0

Спасибо за идею startForeground(), служба работает почти 24 часа на двух отдельных телефонах и не была убита. Кажется, нужно сделать трюк :-) – pableu

6

Попробуйте переопределить метод onCreate() вашего сервиса. Если служба была убита, а затем перезапущена, вызывается onCreate(), но не onStart(). Таким образом, вы можете, например, добавить вызов onStart() из onCreate, чтобы заставить его вести себя как RunKeeperService.

+2

Голосовать. Полностью согласен, что решение должно состоять в том, чтобы вызвать метод start внутри onCreate. Я не согласен с вызовом onStart - он не должен вызываться напрямую. Просто вызовите свой собственный метод, чтобы начать сервис. –

+0

Просто сторона примечания, у меня была эта же проблема. Кажется, onStart автоматически получает вызов. logcat показывает «Планирование перезапуска аварийной службы ...», и через 5 секунд моя служба перезапустится. Такое же поведение в froyo и ICS/JB. – black

+1

Добавляя к вышесказанному, если ваш onStartCommand возвращает START_STICKY, тогда Android вызовет onCreate и onStartCommand. – black

Смежные вопросы