Android. BroadcastReceiver і LocalBroadcastManager

лютого
15
2012
Мітки: android

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

BroadcastExampleActivity.class

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/*" і т.д.

Напишіть перше повідомлення!

Ви повинні увійти під своїм аккаунтом щоб залишати коментарі