В чем разница между START_STICKY
и START_NOT_STICKY
во время реализации сервисов в Android? Кто-нибудь может указать на некоторые стандартные примеры?
источник
В чем разница между START_STICKY
и START_NOT_STICKY
во время реализации сервисов в Android? Кто-нибудь может указать на некоторые стандартные примеры?
Оба кода имеют значение только в том случае, если в телефоне не хватает памяти и он убивает службу, прежде чем она завершит работу. START_STICKY
сообщает ОС, что необходимо восстановить службу после того, как у нее будет достаточно памяти, и onStartCommand()
снова вызвать с нулевым намерением. START_NOT_STICKY
говорит ОС, чтобы она больше не беспокоилась о воссоздании сервиса. Существует также третий код, START_REDELIVER_INTENT
который сообщает операционной системе о необходимости воссоздания службы и повторной доставки того же намерения onStartCommand()
.
Эта статья Дайан Хэкборн объясняет это гораздо лучше, чем официальная документация.
Источник: http://android-developers.blogspot.com.au/2010/02/service-api-changes-starting-with.html
Ключевой частью здесь является новый код результата, возвращаемый функцией, сообщающий системе, что она должна делать со службой, если ее процесс убит во время работы:
START_STICKY в основном совпадает с предыдущим поведением, когда служба остается «запущенной» и позже будет перезапущена системой. Единственное отличие от предыдущих версий платформы состоит в том, что при перезапуске из-за прекращения процесса onStartCommand () будет вызываться для следующего экземпляра службы с нулевым Intent, а не вызываться вообще. Службы, которые используют этот режим, должны всегда проверять этот случай и обращаться с ним соответствующим образом.
START_NOT_STICKY говорит, что после возврата из onStartCreated (), если процесс завершается без оставшихся команд запуска для доставки, служба будет остановлена, а не перезапущена. Это имеет больше смысла для сервисов, которые предназначены для запуска только при выполнении команд, отправленных им. Например, служба может запускаться каждые 15 минут с момента тревоги для опроса какого-либо состояния сети. Если его убивают во время выполнения этой работы, лучше всего просто дать ему остановиться и начать работу при следующем срабатывании будильника.
START_REDELIVER_INTENT аналогичен START_NOT_STICKY, за исключением того, что процесс службы завершается до того, как он вызывает stopSelf () для данного намерения, это намерение будет повторно доставлено ему до его завершения (если только после некоторого количества попыток оно все еще не может завершиться, в этот момент система сдается). Это полезно для служб, которые получают команды работы и хотят убедиться, что они в конечном итоге завершают работу для каждой отправленной команды.
START_NOT_STICKY
?START_REDELIVER_INTENT
это какSTART_NOT_STICKY
. Вместо этого это похоже наSTART_STICKY
Поцелуй ответ
Разница:
START_STICKY
система попытается воссоздать ваш сервис после его уничтожения
START_NOT_STICKY
система не будет пытаться воссоздать ваш сервис после его уничтожения
Стандартный пример:
источник
START_REDELIVER_INTENT
. Я только что проверилSTART_STICKY
и убил приложение с помощью последних приложений. Тогда это отзыв службы. НоSTART_REDELIVER_INTENT
никогда не звонил снова. Зачем?Документация для
START_STICKY
иSTART_NOT_STICKY
довольно проста.START_STICKY:
Пример: Пример локальной службы
START_NOT_STICKY:
Пример: ServiceStartArguments.java
источник