Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РАК и ГАМ / Services.ppt
Скачиваний:
4
Добавлен:
10.02.2015
Размер:
1.03 Mб
Скачать

Результаты:

Как видно, всего заняло 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) {

//Выполняем действий

}

}

}

}

Соседние файлы в папке РАК и ГАМ