Подтвердить что ты не робот

Android-сервис убит с "no longer want" - как его перезапустить?

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

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

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

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

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}

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

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?

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

4b9b3361

Ответ 1

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

Ответ 2

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