
РАК и ГАМ / Services
.pdf•В onCreate создаем некий объект someRes. Этот объект будет использоваться сервисом в обработках вызовов.
•Executors.newFixedThreadPool(1) – эта строка дает нам объект,
который будет получать от нас задачи (Runnable) и запускать их по очереди в одном потоке (на вход ему мы передаем значение 1). Он сделает за нас всю работу по управлению потоками.
•В onStartCommand мы читаем из intent параметр time. Создаем Runnable-объект MyRun, передаем ему time и startId и отдаем этот объект экзекутору, который его запустит в отдельном потоке.
•MyRun – Runnable-объект. Он и будет обрабатывать входящие вызовы сервиса. В конструкторе он получает time и startId.
Параметр time будет использован для кол-ва секунд паузы (т.е. эмуляции работы). А startId будет использован в методе stopSelf(startId), который даст сервису понять, что вызов под номером strartId обработан. В лог выводим инфу о создании, старте и завершении работы. Также здесь используем объект someRes, в лог просто выводим его класс. Если же объект = null, то ловим эту ошибку и выводим ее в лог.
!Не забудьте добавить в манифест наш сервис

Результаты:
Как видно, всего заняло 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