Важно (9.07.22)

Если картинки в постах не отображаются, зайдите в блог через прокси. РКН заблокировал поддомены blogger.com на которые загружались картинки.

понедельник, 25 января 2016 г.

[Android Service] Создание простейшего Сервиса (службы)

Сегодня я начну цикл статей посвящённых созданию сервисов под Android на Delphi. Данные статьи в первую очередь предназначены новичкам. В статье мы попробуем с вами создать простейший Сервис.


Создание сервиса.
  1. Запускаем студию
  2. Жмём File – New - Other
  3. В открывшемся окне выбираем Android Service
  4. В след. окне выбираем Local Service и жмём OK
Студия создаст проект, в Project Manager вы увидите что-то вроде этого:



Давайте дадим проекту более подходящее название, например «MyFirstService».
Теперь сохраним проект в отдельную папку.
Я сделал так: Создал папку «MyFirstServiceProject», в ней создал папку «MyFirstService» и уже в неё сохранил созданный выше сервис.
Внимание!
  • Всегда сохраняйте созданный Сервис в отдельную папку!
  • Никогда не переименовывайте Сервис в «Service»!
Теперь давайте сразу напишем код, необходимый для запуска сервиса.

Дважды щёлкаем в Project Manager по Unit1.pas, перед нами появится форма, переключаемся в режим редактирвоания кода и начинаем писать:
  1. Подключим юнит, позволяющий нам работать с АПИ Андроида, в uses прописываем: Androidapi.JNI.App;
  2. Теперь возвращаемся в режим изменения формы, в Object Inspector выбираем вкладку «Events», там находим событие «OnStartCommand» и дважды щёлкаем по пустому полю рядом.
  3. Студия создаст за нас шаблон функции, нам остаётся только вписать необходимый код.

Код:
Result := TJService.JavaClass.START_STICKY;

Разберём этот код:
В данной строчке мы возвращаем код, позволяющий указать системе, что делать с сервисом, если он был остановлен.

Виды доступных констант:
  • START_STICKY – используется для автоматического перезапуска сервиса (службы), в случае, если система по какой-то причине убила его.
  • START_NOT_STICKY – используется для отмены автоматического перезапуска службы. Подобные сервисы используются для выполнения разовых операций/команд.
  • START_REDELIVER_INTENT – это комбинация предыдущих констант.
Более подробно читайте в официальной справке Service - Service Lifecycle.
Для статьи мы используем первую константу, чтобы показать, что сервис работает и перезапускается при необходимости.
Возвращаемся в среду разработки и сохраняем проект. После чего в Project Manager щёлкаем правой кнопкой мышки по названию проекта (примерно: «libMyFirstService.so») и выбираем «Build».
Создание сервиса завершено, теперь нужно разработать приложение, запускающее этот сервис.

Создание приложения для управления сервисом.
В Project Manager щёлкаем по группе «ProjectGroup1» правой кнопкой, выбираем «Add New Project» и создаём проект «Delphi Projects > Multi-Device Application».
Проект переименуем в «MyFirstServiceApp»
Размещаем на форме кнопку «Start Service» и пишем код для запуска сервиса.
В uses подключаем юнит «System.Android.Service;»

Код кнопки:
TLocalServiceConnection.StartService('MyFirstService');

Теперь остаётся только добавить сервис в приложение и запустить его.

Сейчас наш Project Manager выглядит так:


Щёлкаем правой кнопкой мыши по платформе Android (Android – Android SDK…) и жмём «Add Android Service». Выбираем папку в которой лежит сервис, путь будет примерно такой C:\Users\Пользователь\Desktop\...\MyFirstServiceProject\MyFirstService
Жмём Next и Finish. 

Студия сама добавит 3 файла в проект приложения:
C:\Users\Пользователь\Desktop\...\MyFirstServiceProject\MyFirstService\Android\Debug\libMyFirstService.so
C:\Users\Пользователь\Desktop\...\MyFirstServiceProject\MyFirstService\Android\Debug\MyFirstService.jar
C:\Users\Пользователь\Desktop\...\MyFirstServiceProject\MyFirstService\Unit1.pas

На этом всё, компилируем проект на устройстве.

Внимание!
Если вы скачали готовый проект, то обязательно перепроверьте пути в Deployment Manager. Возможна ситуация, когда пути до библиотек будут прописаны мои, т.е. вам необходимо:
в Deployment Manager нажать на кнопку "Revert to Default"
в Project Manager удалить из проекта ".. - MyFirstService - Unit1.pas"
после этого заново добавьте сервис (службу) в приложение.
Далее можно компилировать.


Справка по сервисам - Creating Android Services

Видео