10 October 2024
Широкомовні приймачі прослуховують широкомовні повідомлення системи. Приклади таких повідомлень: низький заряд батареї, натиснута кнопка камери, встановлено нову програму тощо.
Крім системних подій, користувач може створювати свої події, наприклад, коли потік завершив обчислення або коли потік почав роботу.
Широкомовний приймач — це об'єкт класу 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();
}
}