Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

РАК и ГАМ / Services

.pdf
Скачиваний:
10
Добавлен:
10.02.2015
Размер:
1.08 Mб
Скачать

В 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

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