Несокрушимый сервис

Ответить
kasperdun
Сообщения: 12
Зарегистрирован: 24 ноя 2014, 22:35

Несокрушимый сервис

Сообщение kasperdun » 26 ноя 2014, 23:07

Всем привет, кучка вопросов:

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

Как проверить из активити, перед запуском сервиса, что он еще не запущен?

Насколько правильно идентифицировать устройства по Device_id (насколько я понял это IMEI ?):

Код: Выделить всё

TelephonyManager mTelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
String deviceId = mTelephonyMgr.getDeviceId();
И как вы идентифицируете разные устройства.

Назовите библиотеки которыми вы пользуетесь и для чего они.
Особенно интересует для работы с GPS, БД, файловой системой, камерой, снятие скриншотов, запись аудио с микрофона.

Аватара пользователя
DenK
Сообщения: 11
Зарегистрирован: 15 июл 2014, 10:15
Откуда: Нижний Новгород

Re: Несокрушимый сервис

Сообщение DenK » 03 дек 2014, 15:35

Сори за копипаст.
Вот про это подробнее почитай и вопросы отпадут.

Сервисы запускаются в главном потоке приложения; это значит, что любые операции, выполняющиеся в обработчике onStartCommand(), будут работать в контексте главного потока GUI. На практике при реализации сервиса в методе onStartCommand() создают и запускают новый поток, чтобы выполнять операции в фоновом режиме и останавливать сервис, когда работа завершена.

Такой подход позволяет методу onStartCommand() быстро завершить работу и даёт возможность контролировать поведение сервиса при его повторном запуске, используя одну из констант.

START_STICKY - Описывает стандартное поведение. Похоже на то, как был реализован метод onStart() в Android 2.0. Если вы вернете это значение, обработчик onStartCommand() будет вызываться при повторном запуске сервиса после преждевременного завершения работы. Обратите внимание, что аргумент Intent, передаваемый в onStartCommand(), получит значение null. Данный режим обычно используется для сервисов, которые сами обрабатывают свои состояния, явно стартуя и завершая свою работу при необходимости (с помощью методов startService() и stopService()). Это относится к сервисам, которые проигрывают музыку или выполняют другие задачи в фоновом режиме
START_NOT_STICKY - Этот режим используется в сервисах, которые запускаются для выполнения конкретных действий или команд. Как правило, такие сервисы используют stopSelf() для прекращения работы, как только команда выполнена. После преждевременного прекращения работы сервисы, работающие в данном режиме, повторно запускаются только в том случае, если получат вызовы. Если с момента завершения работы Сервиса не был запущен метод startService(), он остановится без вызова обработчика onStartCommand(). Данный режим идеально подходит для сервисов, которые обрабатывают конкретные запросы, особенно это касается регулярного выполнения заданных действий (например, обновления или сетевые запросы). Вместо того, чтобы перезапускать сервис при нехватке ресурсов, часто более целесообразно позволить ему остановиться и повторить попытку запуска по прошествии запланированного интервала
START_REDELIVER_INTENT - В некоторых случаях нужно убедиться, что команды, которые вы посылаете сервису, выполнены. Этот режим — комбинация предыдущих двух. Если система преждевременно завершила работу сервиса, он запустится повторно, но только когда будет сделан явный запрос на запуск или если процесс завершился до вызова метода stopSelf(). В последнем случае вызовется обработчик onStartCommand(), он получит первоначальное намерение, обработка которого не завершилась должным образом.
Обратите внимание, что при окончании всех операций каждый из этих режимов требует явной остановки сервиса с помощью методов stopService() или stopSelf().

Режим перезапуска, который вы указываете в качестве значения, возвращаемого методом onStartCommand(), будет влиять на параметры, передаваемые при последующих вызовах.

Изначально намерение выступает в качестве параметра, который передастся в метод startService() при запуске сервиса. После перезапуска системой он может иметь значение null (если установлен режим START_STICKY) или оригинальное (если установлен флаг START_REDELIVER_INTENT).

Параметр flag может помочь узнать, как именно был запущен сервис:

START_FLAG_REDELIVERY — указывает на то, что параметр Intent повторно передан при принудительном завершении работы сервиса перед явным вызовом метода stopSelf()
START_FLAG_RETRY — указывает на то, что сервис повторно запущен после непредвиденного завершения работы; передается в том случае, если ранее сервис работал в режиме START_STICKY

Код: Выделить всё

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if ((flags & START_FLAG_RETRY) == 0) {
        // TODO Если это повторный запуск, выполнить какие-то действия.
    }
    else {
        // TODO Альтернативные действия в фоновом режиме.
    }
    return Service.START_STICKY;
}

Ответить