Всем привет! Мы недавно издали обновлённый труд Дэвида Гриффитса и Дона Гриффитса. Предлагаем ознакомится с 19 главой «Связанные службы»
Запускаемые службы отлично подходят для фоновых операций — а если вам нужна служба с большей интерактивностью? В этой главе вы научитесь создавать связанные службы — разновидность служб, с которыми могут взаимодействовать ваши активности. Вы узнаете, как выполнить привязку к службе и как отменить ее после завершения работы для экономии ресурсов. Служба позиционирования Android поможет вам получать информацию местонахождения от GPS-приемника вашего устройства. Наконец, вы научитесь пользоваться моделью разрешений Android, включая обработку запросов разрешений во время выполнения.
Связанные службы привязываются к другим компонентам
Как упоминалось в главе 18, запускаемая служба начинает работу при передаче интента. Она выполняет код в фоновом режиме и останавливается при завершении операции. Такие службы продолжают выполняться даже в том случае, если запустивший их компонент уничтожается.
Связанная служба привязывается к другому компоненту — например, к активности. В отличие от запускаемых служб, компонент может взаимодействовать со связанной службой и вызывать ее методы.
Чтобы увидеть, как работают связанные службы, мы создадим новое приложение со связанной службой, которая, словно одометр, измеряет пройденное машиной расстояние. Для измерения расстояния будет использоваться служба позиционирования Android:
Что мы собираемся сделать
Процесс построения приложения будет состоять из трех основных шагов:
Создание проекта Odometer
Начнем с создания проекта. Создайте для приложения новый проект Android с именем «Odometer», доменом компании «hfad.com» и именем пакета com.hfad.odometer. Минимальный уровень SDK должен быть равен API 19, чтобы приложение работало на большинстве устройств. Создайте пустую активность с именем «MainActivity» и макет с именем «activity_main», чтобы ваш код не отличался от нашего. Обязательно снимите флажок Backwards Compatibility (AppCompat) при создании активности.
В этом коде реализуется единственный метод onBind(), который вызывается, когда компонент (например, активности) выдаст запрос на связывание со службой. Метод получает один параметр Intent и возвращает объект IBinder. Интерфейс IBinder используется для связывания службы с активностью; вы должны предоставить его реализацию в коде своей службы. Сейчас вы узнаете, как это делается.
Реализация IBinder
Чтобы реализовать IBinder, добавьте в код службы новый внутренний класс, который расширяет класс Binder (реализующий интенфейс IBinder). Внутренний класс должен включать метод, используемый активностями для получения ссылки на связанную службу.
Мы определим класс OdometerBinder, который используется MainActivity для получения ссылки на OdometerService. Код ее определения выглядит так:
Мы написали весь код службы, необходимый для связывания MainActivity с OdometerService.
Теперь добавим в службу новый метод, с которым она будет возвращать случайное число.
Добавление метода getDistance()
В класс OdometerService будет добавлен код с именем getDistance(), который будет вызываться нашей активностью. Пока он будет возвращать случайное число, а позднее мы обновим его так, чтобы он использовал службу позиционирования Android.
Ниже приведен полный код OdometerService.java; внесите в свою версию
изменения, выделенные жирным шрифтом:
Теперь обновим класс MainActivity для использования OdometerService.
Обновление макета MainActivity
Следующий шаг в построении приложения — связывание активности MainActivity со службой OdometerService и вызов ее метода getDistance(). Начнем с добавления надписи в макет
MainActivity. В ней будет выводиться число, возвращенное методом getDistance() класса OdometerService.
Измените свою версию разметки activity_main.xml и внесите изменения, выделенные жирным шрифтом:
» Более подробно с книгой можно ознакомиться на сайте издательства
» Оглаление
» Отрывок
Для Хаброжителей скидка 20% по купону — Head First
Автор: ph_piter