Что происходит с сервисом, запущенным BOOT_COMPLETE после того, как система его убьет? - PullRequest
2 голосов
/ 14 июля 2011

Что происходит с сервисом, запущенным BOOT_COMPLETE после того, как система убивает его из-за памяти?

Будет ли он перезапущен без перезагрузки телефона?Можно ли как-нибудь перезапустить его?

Каков наилучший способ избежать как можно большего уничтожения важной службы?

Ответы [ 4 ]

1 голос
/ 14 июля 2011

Будет ли он перезапущен без перезагрузки телефона?

Возможно. Если это действительно так, потому что «система убивает его из-за памяти», и вы возвращаете соответствующее значение из onStartCommand() (например, START_STICKY), оно должно быть перезапущено в какой-то момент в будущем. Если служба была убита из-за действий пользователя (например, принудительное отключение на экране «Управление службами» в настройках), она не будет перезапущена.

Какова наилучшая практика, позволяющая избежать как можно большего уничтожения важной службы?

Во-первых, разработайте свое приложение так, чтобы оно не зависело от такого постоянного сервиса. 99,44% приложений Android не нуждаются в сервисе, работающем непрерывно, не говоря уже о сервисе, который начинает это делать во время загрузки. Пользователи устройств Android ненавидят разработчиков, которые считают, что их приложения ооооооооооооооооооченны, потому что у них постоянно работают службы, поэтому у нас есть службы убийц задач, Force Stop и Android из-за старости. Например, если вы проверяете новую электронную почту каждые 15 минут, используйте AlarmManager и IntentService, а не службу, которая работает вечно.

Если вы можете продемонстрировать - мне и вашим пользователям - что ваше приложение входит в число 0,56% приложений, которым действительно нужен сервис, который запускается во время загрузки и работает вечно, вы можете использовать startForeground(). Это будет указывать ОС, что ваш сервис является частью пользовательского интерфейса. Вам нужно будет отобразить Notification, в идеале, чтобы позволить пользователю аккуратно завершить работу вашей службы, если и когда пользователь перестанет чувствовать, что это оправдано.

1 голос
/ 14 июля 2011

Возможно, вы захотите взглянуть на START_STICKY

1 голос
/ 14 июля 2011

Если вам нужно перезапустить службу, вам следует использовать AlarmManager для проверки службы в отдельном BroadcastReceiver, но номинально, когда служба уничтожается системой из-за памяти, она не будет автоматически перезапущена.

0 голосов
/ 14 июля 2011

Используйте AlarmManager для периодической отправки Намерения - получите намерение и убедитесь, что ваша служба работает.

...