
- •КАЛУЖСКИЙ ФИЛИАЛ ФЕДЕРАЛЬНОГО ГОСУДАРСТВЕННОГО БЮДЖЕТНОГО
- •Службы (Сервисы)
- •Жизненный цикл служб
- •Жизненный цикл служб
- •Службы
- •Жизненный цикл служб
- •Создание службы
- •Опишем класс MyService, наследующий класс Service
- •activity_main.xml
- •Опишем класс MainActivity
- •Службу необходимо прописать в манифесте. При нажатии Add, появится список в котором нужно
- •Основная форма приложения:
- •Исходный код службы
- •Лог работы службы :
- •Передача данных в службу. Остановка службы.
- •activity_main.xml
- •Создадим класс MainActivity
- •Создадим класс MyService
- •//продолжение
- ••В onCreate создаем некий объект someRes. Этот объект будет использоваться сервисом в обработках
- •Результаты:
- •Как видно, всего заняло 15 секунд на выполнение данной задачи. А если изменить
- •Результаты:
- •Обратная связь с помощью PendingIntent
- •Шаги 1, 2 и 3
- •Обратная связь с помощью BroadcastReceiver
- •Подключение к службе
- •Опишем файл компоновки приложения
- •Опишем класс приложения MainActivity
- •//продолжение
- •Опишем класс службы MyService
- •//продолжение
- •Описание
- •Метод downInterval получает на вход значение, уменьшает interval на это значение (но так,
- •Скриншоты

Результаты:
Как видно, всего заняло 15 секунд на выполнение данной задачи. А если изменить количество потоков, одновременно обрабатываемых экзекутором на 3:
public void onCreate() { super.onCreate();
Log.d(LOG_TAG, "MyService onCreate"); es = Executors.newFixedThreadPool(3); someRes = new Object();
}

Результаты:
Как видно, изменилось время выполнения, а также произошла ситуация, когда в onDestroy освободился объект, который еще был нужен
Обратная связь с помощью PendingIntent
PendingIntent является ещё одним механизмом, к помощью которого в Activity можно получать результаты работы службы.
Схема работы:
1)Создать в Activity PendingIntent с помощью метода createPendingResult
2)Вложить PendingIntent в обычный Intent, который используется для старта службы
3)Вызвать startService
4)В службе извлечь PendingIntent из полученного в методе onStartCommand объекта Intent
5)При необходимости передачи результатов работы из службы в Activity, вызвать метод send для объекта PendingIntent
6)Перехватить результаты из службы в Activity в методе onActivityResult
Шаги 1, 2 и 3
// Создаем PendingIntent
pi = createPendingResult("time", null, 0);
//Создаем Intent для вызова службы, кладем туда PendingIntent
intent = new Intent(this, MyService.class).putExtra(PARAM_TIME, 7)
.putExtra("pendingIntent", pi);
//запускаем службу
startService(intent);
Шаг 4
public int onStartCommand(Intent intent, int flags, int startId) {
int time = intent.getIntExtra("time", 1); PendingIntent pi =
intent.getParcelableExtra("pendingIntent");
return super.onStartCommand(intent, flags, startId);
}
Шаг 5
//способ 1 pi.send(100); //или
//способ 2
Intent intent = new Intent().putExtra("result", time * 100);
pi.send(MyService.this, 200, intent);
Шаг 6
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//Ловим сообщения о старте задач if (resultCode == 100) {
switch (requestCode) {
//вы полнить какие либо действия
}
}
//Ловим сообщения об окончании задач if (resultCode == STATUS_FINISH) {
int result = data.getIntExtra("result", 0); switch (requestCode) {
//вы полнить какие либо действия
}
}
}
Обратная связь с помощью BroadcastReceiver
BroadcastReceiver позволяет прослушивать все Intent объекты возникающие в системе и извлекать только совпадающие с IntentFilter.
Схема работы:
1)В Activity создать BroadcastReceiver и IntentFilter, настроенный на определенный Action.
2)Зарегистрировать эту пару
3)При необходимости передачи результатов работы из службы в Activity, создать Intent объект, заполнить его данными и отправить.
4)Перехватить результаты из службы в Activity в методе onReceive объекта
BroadcastReceiver
Шаг 1
// создаем BroadcastReceiver
br = new BroadcastReceiver() { //Определить действия класса
};
// создаем фильтр для BroadcastReceiver IntentFilter intFilt = new
IntentFilter("ru.hecsit.myservice");
Шаг 2
registerReceiver(br, intFilt);
!!примечание: система не производит снятие регистрации BroadcastReceiver’ов после закрытия приложения. Разработчик обязан сделать это самостоятельно.
protected void onDestroy() { super.onDestroy();
// выключаем BroadcastReceiver unregisterReceiver(br);
}
Шаг 3
Intent intent = new Intent("ru.hecsit.myservice"); // сообщаем о старте задачи intent.putExtra("task", task); sendBroadcast(intent);
Шаг 4
//содержимое класса
br = new BroadcastReceiver() {
// действия при получении сообщений
public void onReceive(Context context, Intent intent) { int task = intent.getIntExtra(PARAM_TASK, 0);
int status = intent.getIntExtra(PARAM_STATUS, 0);
//Ловим сообщения о старте задач if (status == 100) {
switch (task) { //Выполняем действий
}
}
//Ловим сообщения об окончании задач if (status == 200) {
int result = intent.getIntExtra("result", 0); switch (task) {
//Выполняем действий
}
}
}
}