Android осень 2013 лекция 5

24
Services Лекция 5

Transcript of Android осень 2013 лекция 5

Page 1: Android осень 2013 лекция 5

Services

Лекция №5

Page 2: Android осень 2013 лекция 5

Service

extends Service

Длительные операции

Нет интерфейса

Любой может запустить(если нет настроек приватности)

Два вида: Started Service

BoundService

Выполняется в main Thread(!)

Средство формирования архитектуры приложения

2

Page 3: Android осень 2013 лекция 5

Service или поток?

Service

Может выполняться, даже когда пользователь не взаимодействует с приложением

Thread

Выполняется, только когда приложение запущено

3

Page 4: Android осень 2013 лекция 5

Life cycle методы

onStartCommand()

Вызовется, если вызвать startService()

После выполнения этого метода сервис считается запущенным

Если он реализован – мы должны сами останавливать сервис(stopSelf() или stopService())

onBind()

Возвращает интерфейс(Ibinder) через который компонент, вызвавший onBind(), будет общаться с сервисом

Всегда должен быть реализован

Если не нужен bind – возвращать null

onCreate()

Вызывается один раз самым первым

Используется для одноразовой инициализации чего-нибудь

onDestroy()

4

Page 5: Android осень 2013 лекция 5

Как долго выполняется сервис?

StartedService

Пока сам не остановит себя с помощью stopSelf()

Пока кто-нибудь не вызовет stopService()

BoundService

Пока хоть кто-нибудь привязан с сервису он существует, иначе система уничтожает его

Система убьет сервис только при условии нехватки памяти

Система запустит сервис, как только появятся ресурсы

5

Page 6: Android осень 2013 лекция 5

Service in Manifest

6

Page 7: Android осень 2013 лекция 5

StartedService

Запускается другим компонентом

По умолчанию в main thread(!)

Независимый life cycle

onStartCommand()

Получает Intent

extends Service

Базовый класс

main thread(!)

extends IntentService

Подкласс Service

Worker thread

Выполняет запросы в порядке очереди

onHandleIntent()

7

Page 8: Android осень 2013 лекция 5

Intent Service

Популярен

Выполняет задачи по одной в отдельном потоке

Останавливает сервис, когда все запросы выполнены

Все что нужно – имплементировать onHandleIntent() и конструктор

8

Page 9: Android осень 2013 лекция 5

IntentService

9

Page 10: Android осень 2013 лекция 5

onStartCommand() return

Что системе делать с сервисом, если ей пришлось убить его(если это произошло после окончания onStartCommand())

START_NOT_STICKY

Не пересоздавать сервис

START_STICKY

Пересоздать и вызвать onStartCommand()

Не получит последний Intent(будет null)

START_REDELIVER_INTENT

Тоже самое, но передает последний intent

10

Page 11: Android осень 2013 лекция 5

Bound Service

Длительное соединение

Взаимодействие с другими приложениями

onBind()

Ibinder

Интерфейс взаимодействия

Если нет ни одного клиента – сервис уничтожается

ServiceConnection

bindService() не ждет коннекта

onBind() вызвается только один раз

11

Page 12: Android осень 2013 лекция 5

Создание Bound Service

3 способа определения Ibinder интерфейса

extends Binder

Приватный сервис

onBind() возвращает наследника, через которого можно вызвать публичные методы сервиса

Основной вариант

Messenger

Сервис взаимодействует с несколькими процессами

Thread safe

AIDL

Android Interface Definition Language

Несколько процессов

Повсеместно используется в системе

Concurrency

12

Page 13: Android осень 2013 лекция 5

Extends Binder

Метод getService(), возвращающий this

Метод getService(), возвращающий любой другой класс, содержащий реализацию интерфейса

Просто является имплементацией интерфейса

Почему это работает, только если сервис в том же приложении, что и его клиенты?

13

Page 14: Android осень 2013 лекция 5

Example

14

Page 15: Android осень 2013 лекция 5

Example

15

Page 16: Android осень 2013 лекция 5

BoundService life cycle

16

Page 17: Android осень 2013 лекция 5

Life cycle callbacks

17

Page 18: Android осень 2013 лекция 5

Foreground Service

Хоть и без интерфейса, но пользователь взаимодействует с ним(проигрывание музыки)

Должен создать нотификацию(в status bar)

Теоретически система никогда не убьет его

startForeground(id, notification)

Id != 0

stopForeground(boolean)

18

Page 19: Android осень 2013 лекция 5

Notifications

Design guidelines

Обычный

Расширенный

Builder

Оповещения от сервисов и ресиверов

19

Page 20: Android осень 2013 лекция 5

Notifications

20

1)Title2)Large icon3)Content4)Info5)Small icon6)Time7)Time

Page 21: Android осень 2013 лекция 5

Notifications

1)Title

2)Large icon

3)Content

4)Info

5)Small icon

6)Time

7)Details

21

Page 22: Android осень 2013 лекция 5

Create notification

Notification.Builder

NotificationCompat.Builder (support library)

Notify()

Обязательно:

Small icon

Title

Text

PendingIntent

22

Page 23: Android осень 2013 лекция 5

Create Notification

23

Page 24: Android осень 2013 лекция 5

Broadcast receiver

Системные оповещения

Взаимодействие с другими приложениями

onReceive()

Security

Объявление в манифесте

extends BroadcastReceiver

Можно регистрировать в runtime

http://developer.android.com/reference/android/content/Intent.html

24