BroadcastReceiver - базовий клас для коду, який буде отримувати intent, відіслані за допомогою методу sendBroadcast(). Розглянемо використання цього класу з класом LocalBroadcastManager.
Існує два основних способи відсилання повідомлень:
У деяких ситуаціях при передачі повідомлення за допомогою методу sendBroadcast система може вести себе як з методом sendOrderedBroadcast, тобто, доставка повідомлення одному одержувачу за один раз. Зокрема, це відбуватиметься для слухачів, які створюють процес для того щоб уникнути перевантаження системи.
У цій статті розглянемо найбільш використовуваний метод - sendBroadcast. Для початку нам знадобиться слухач:
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("lbr", "Message received: " + intent.getStringExtra("message") );
}
};
Слухач повинен розширювати клас BroadcastReceiver і реалізовувати метод onReceive. Методу onReceive передається context об'єкту, що надіслав повідомлення. Це дуже зручно, враховуючи те, що з контекстом доводиться працювати дуже часто. Другий параметр - intent - містить інформацію про повідомлення, в тому числі службові дані. В нашому випадку, єдиними службовими даними є рядок message, який отримуємо, використовуючи метод getStringExtra.
Слухач створений, реєструємо його:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// some code
LocalBroadcastManager.getInstance(this).registerReceiver( receiver, new IntentFilter( "com.seostella.myaction" ) );
// some code
}
І прибираємо реєстрацію, коли програма завершується:
@Override
public void onDestroy() {
LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
super.onDestroy();
}
Щоб відправити подію слухачеві receiver, необхідно скористатися наступним кодом:
Intent serviceStartedIntent = new Intent( "com.seostella.myaction" );
serviceStartedIntent.putExtra("message", "myaction message");
LocalBroadcastManager.getInstance( getBaseContext() ).sendBroadcast(serviceStartedIntent);
Наведемо лістинг програми, що використовує BroadcastReceiver. Вам необхідно додати в проект бібліотеку android-support-v4.jar, яка знаходиться за наступним шляхом /%ANDROID_SDK%/extras/android/support/v4
package com.seostella.broadcastexample;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
public class BroadcastExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LocalBroadcastManager.getInstance(this).registerReceiver( receiver, new IntentFilter( "com.seostella.myaction" ) );
new Thread(){
@Override
public void run(){
Intent serviceStartedIntent = new Intent( "com.seostella.myaction" );
serviceStartedIntent.putExtra("message", "myaction message");
LocalBroadcastManager.getInstance( getBaseContext() ).sendBroadcast(serviceStartedIntent);
}
}.start();
}
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("lbr", "Message received: " + intent.getStringExtra("message") );
}
};
@Override
public void onDestroy() {
LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
super.onDestroy();
}
}
В IntentFilter також можна додавати категорії для конкретизації одержувача.
Цікава поведінка відбувається при використанні dataType з IntentFilter. Слухач, який підписався на dataType виду "audio/*", отримуватиме всі повідомлення, які задовольняють цьому регулярному виразу, тобто, "audio/mpeg", "audio/aiff", "audio/*" і т.д.