Download - Android осень 2013 лекция 5
Services
Лекция №5
Service
extends Service
Длительные операции
Нет интерфейса
Любой может запустить(если нет настроек приватности)
Два вида: Started Service
BoundService
Выполняется в main Thread(!)
Средство формирования архитектуры приложения
2
Service или поток?
Service
Может выполняться, даже когда пользователь не взаимодействует с приложением
Thread
Выполняется, только когда приложение запущено
3
Life cycle методы
onStartCommand()
Вызовется, если вызвать startService()
После выполнения этого метода сервис считается запущенным
Если он реализован – мы должны сами останавливать сервис(stopSelf() или stopService())
onBind()
Возвращает интерфейс(Ibinder) через который компонент, вызвавший onBind(), будет общаться с сервисом
Всегда должен быть реализован
Если не нужен bind – возвращать null
onCreate()
Вызывается один раз самым первым
Используется для одноразовой инициализации чего-нибудь
onDestroy()
4
Как долго выполняется сервис?
StartedService
Пока сам не остановит себя с помощью stopSelf()
Пока кто-нибудь не вызовет stopService()
BoundService
Пока хоть кто-нибудь привязан с сервису он существует, иначе система уничтожает его
Система убьет сервис только при условии нехватки памяти
Система запустит сервис, как только появятся ресурсы
5
Service in Manifest
6
StartedService
Запускается другим компонентом
По умолчанию в main thread(!)
Независимый life cycle
onStartCommand()
Получает Intent
extends Service
Базовый класс
main thread(!)
extends IntentService
Подкласс Service
Worker thread
Выполняет запросы в порядке очереди
onHandleIntent()
7
Intent Service
Популярен
Выполняет задачи по одной в отдельном потоке
Останавливает сервис, когда все запросы выполнены
Все что нужно – имплементировать onHandleIntent() и конструктор
8
IntentService
9
onStartCommand() return
Что системе делать с сервисом, если ей пришлось убить его(если это произошло после окончания onStartCommand())
START_NOT_STICKY
Не пересоздавать сервис
START_STICKY
Пересоздать и вызвать onStartCommand()
Не получит последний Intent(будет null)
START_REDELIVER_INTENT
Тоже самое, но передает последний intent
10
Bound Service
Длительное соединение
Взаимодействие с другими приложениями
onBind()
Ibinder
Интерфейс взаимодействия
Если нет ни одного клиента – сервис уничтожается
ServiceConnection
bindService() не ждет коннекта
onBind() вызвается только один раз
11
Создание Bound Service
3 способа определения Ibinder интерфейса
extends Binder
Приватный сервис
onBind() возвращает наследника, через которого можно вызвать публичные методы сервиса
Основной вариант
Messenger
Сервис взаимодействует с несколькими процессами
Thread safe
AIDL
Android Interface Definition Language
Несколько процессов
Повсеместно используется в системе
Concurrency
12
Extends Binder
Метод getService(), возвращающий this
Метод getService(), возвращающий любой другой класс, содержащий реализацию интерфейса
Просто является имплементацией интерфейса
Почему это работает, только если сервис в том же приложении, что и его клиенты?
13
Example
14
Example
15
BoundService life cycle
16
Life cycle callbacks
17
Foreground Service
Хоть и без интерфейса, но пользователь взаимодействует с ним(проигрывание музыки)
Должен создать нотификацию(в status bar)
Теоретически система никогда не убьет его
startForeground(id, notification)
Id != 0
stopForeground(boolean)
18
Notifications
Design guidelines
Обычный
Расширенный
Builder
Оповещения от сервисов и ресиверов
19
Notifications
20
1)Title2)Large icon3)Content4)Info5)Small icon6)Time7)Time
Notifications
1)Title
2)Large icon
3)Content
4)Info
5)Small icon
6)Time
7)Details
21
Create notification
Notification.Builder
NotificationCompat.Builder (support library)
Notify()
Обязательно:
Small icon
Title
Text
PendingIntent
22
Create Notification
23
Broadcast receiver
Системные оповещения
Взаимодействие с другими приложениями
onReceive()
Security
Объявление в манифесте
extends BroadcastReceiver
Можно регистрировать в runtime
http://developer.android.com/reference/android/content/Intent.html
24