Android-сервис убит с «больше не хочу» - как его перезапустить? - PullRequest
22 голосов
/ 21 июля 2010

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

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

В любом случае, моя проблема в том, что служба убита через некоторое время работы.Иногда через час, иногда только через 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?

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

Ответы [ 2 ]

13 голосов
/ 21 июля 2010

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

6 голосов
/ 23 июля 2010

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

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