2. Service
extends Service
Длительные операции
Нет интерфейса
Любой может запустить(если нет настроек приватности)
Два вида:
Started Service
BoundService
Выполняется в main Thread(!)
Средство формирования архитектуры приложения
2
3. Service или поток?
Service
Может выполняться, даже когда пользователь не
взаимодействует с приложением
Thread
Выполняется, только когда приложение запущено
3
4. Life cycle методы
onStartCommand()
Вызовется, если вызвать startService()
После выполнения этого метода сервис считается запущенным
Если он реализован – мы должны сами останавливать сервис(stopSelf() или
stopService())
onBind()
Возвращает интерфейс(Ibinder) через который компонент, вызвавший
onBind(), будет общаться с сервисом
Всегда должен быть реализован
Если не нужен bind – возвращать null
onCreate()
Вызывается один раз самым первым
Используется для одноразовой инициализации чего-нибудь
onDestroy()
4
5. Как долго выполняется сервис?
StartedService
Пока сам не остановит себя с помощью stopSelf()
Пока кто-нибудь не вызовет stopService()
BoundService
Пока хоть кто-нибудь привязан с сервису он существует,
иначе система уничтожает его
Система убьет сервис только при условии нехватки
памяти
Система запустит сервис, как только появятся
ресурсы
5
7. StartedService
Запускается другим компонентом
По умолчанию в main thread(!)
Независимый life cycle
onStartCommand()
Получает Intent
extends Service
Базовый класс
main thread(!)
extends IntentService
Подкласс Service
Worker thread
Выполняет запросы в порядке очереди
onHandleIntent()
7
8. Intent Service
Популярен
Выполняет задачи по одной в отдельном потоке
Останавливает сервис, когда все запросы
выполнены
Все что нужно – имплементировать onHandleIntent()
и конструктор
8
10. onStartCommand() return
Что системе делать с сервисом, если ей пришлось
убить его(если это произошло после окончания
onStartCommand())
START_NOT_STICKY
Не пересоздавать сервис
START_STICKY
Пересоздать и вызвать onStartCommand()
Не получит последний Intent(будет null)
START_REDELIVER_INTENT
Тоже самое, но передает последний intent
10
12. Создание Bound Service
3 способа определения Ibinder интерфейса
extends Binder
Приватный сервис
onBind() возвращает наследника, через которого можно вызвать публичные методы
сервиса
Основной вариант
Messenger
Сервис взаимодействует с несколькими процессами
Thread safe
AIDL
Android Interface Definition Language
Несколько процессов
Повсеместно используется в системе
Concurrency
12
13. Extends Binder
Метод getService(), возвращающий this
Метод getService(), возвращающий любой другой
класс, содержащий реализацию интерфейса
Просто является имплементацией интерфейса
Почему это работает, только если сервис в том же
приложении, что и его клиенты?
13
18. Foreground Service
Хоть и без интерфейса, но пользователь
взаимодействует с ним(проигрывание музыки)
Должен создать нотификацию(в status bar)
Теоретически система никогда не убьет его
startForeground(id, notification)
Id != 0
stopForeground(boolean)
18