Широкомовні приймачі


Широкомовні приймачі

Широкомовні приймачі прослуховують широкомовні повідомлення системи. Приклади таких повідомлень: низький заряд батареї, натиснута кнопка камери, встановлено нову програму тощо.

Крім системних подій, користувач може створювати свої події, наприклад, коли потік завершив обчислення або коли потік почав роботу.

Широкомовний приймач — це об'єкт класу BroadcastReceiver або одного з його підкласів. Найголовніший метод цього класу - onReceive(), який викликається, коли приймач отримує повідомлення.

Розглянемо приклад запуску служби на підставі отримання широкомовного повідомлення. натискання кнопки камери. Приймач буде прослуховувати повідомлення, фільтр наміру буде встановлений на дію Intent.ACTION_CAMERA_BUTTON відповідає натисканню кнопки камери.

Зареєструвати приймач можна функцією registerReceiver(), а видалити приймач — функцією unregisterReceiver().

Отже, почнемо створювати наш додаток. Код основної діяльності MainActivity представлений у файлі MainActivity.java (листинг 1).

Листинг 1. Код основної діяльності (MainActivity.java)

package com.samples.my_receiver;

import android.app.Activity;

import android.content.Intent;

import android.content.IntentFilter;

import android.os.Bundle;

public class MainActivity extends Activity {

        // Створюємо об'єкт iReceiver класу MyReceiver

MyReceiver iReceiver = New MyReceiver();

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

// Створюємо фільтр наміру

IntentFilter iFilter =

new IntentFilter(Intent.ACTION_CAMERA_BUTTON);

                 // Добавляем дія в фільтр

iFilter.addAction(Intent.ACTION_PACKAGE_ADDED);

// Реєструємо приймач

registerReceiver(iReceiver, iFilter);

}

@Override

protected void onDestroy() {

// Знищуємо приймач при завершенні програми

unregisterReceiver(iReceiver);

super.onDestroy();

}

}

Розберемося, що є що. Насамперед ми оголосили об'єкт iReceiver класу MyReceiver. Цей клас буде описано пізніше. Потім ми створили фільтр наміру:

IntentFilter iFilter = новий IntentFilter(Intent.ACTION_CAMERA_BUTTON);

iFilter.addAction(Intent.ACTION_PACKAGE_ADDED);

Після цього потрібно лише зареєструвати приймач з registerReceiver(). Перший параметр — це сам приймач, другий — фільтр намірів:

registerReceiver(iReceiver, iFilter);

Тепер потрібно створити клас MyReceiver. Як це зробити за допомогою Eclipse, ви вже знаєте, тому наводжу одразу код класу (листинг 2).

Листинг 2. Код класу MyReceiver (файл MyReceiver.java)

package com.samples.my_receiver;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

// Клас MyReceiver є розширенням класу BroadcastReceiver

public class MyReceiver extends BroadcastReceiver {

        // Перевизначаємо метод onReceive()

@Override

public void onReceive(Context rcvContext, Intent rcvIntent) {

String action = rcvIntent.getAction();

// Якщо дія = Intent.ACTION_CAMERA_BUTTON

if (action.equals(Intent.ACTION_CAMERA_BUTTON)) {

        // то запускаємо сервіс MyService

rcvContext.startService(new Intent(rcvContext,

MyService.class));

}

}

}

 

Приймач аналізує отриману дію. Якщо натиснуто кнопка камери, то буде запущено сервіс (служба) MyService, описаний у файлі MyService.java. Код цього файлу представлений у лістингу 3. Вам потрібно змінити тільки перший рядок, вона має виглядати так:

package com.samples.my_receiver;

У цьому розділі розглянули створення потоків, служб та широкомовних приймачів. У наступній ми поговоримо про створення анімації в Android-додатках

Листинг 3. Файл MyService.java

package com.samples.my_first_service;

 

import android.app.Service;

import android.content.Intent;

import android.media.MediaPlayer;

import android.os.IBinder;

import android.widget.Toast;

 

public class MyService extends Service {

 

@Override

public IBinder onBind(Intent arg0) {

return null;

}

 

@Override

public void onCreate() {

super.onCreate();

Toast.makeText(this,"Service started...",

Toast.LENGTH_LONG).show();

}

 

@Override

public void onDestroy() {

super.onDestroy();

Toast.makeText(this, "Service destroyed...",

Toast.LENGTH_LONG).show();

}

}