1. 程式人生 > >LocalBroadcastManager(本地/應用內廣播管理器)

LocalBroadcastManager(本地/應用內廣播管理器)

LocalBroadcastManager簡介

BroadcastReceiver 的設計初衷就是從全域性考慮的,可以方便應用程式和系統、應用程式之間、應用程式內的通訊,所以對單個應用程式而言BroadcastReceiver是存在安全性問題的。這些安全問題都可以通過 LocalBroadcastManager 來解決,LocalBroadcastManager 只會將廣播限定在當前應用程式中。LocalBroadcastManager  傳送的廣播不會離開你的應用程式,同樣也不會接收來自其它應用程式的廣播,因此你可以放心的在 LocalBroadcastManager 中傳播敏感資訊。同時由於LocalBroadcastManager不需要用到跨程序機制,因此相對 BroadcastReceiver 而言要更為高效。

LocalBroadcastManager 是 android.support.v4 擴充套件包中的一個類。

範例

MainActivity

public class MainActivity extends Activity {
	Button button1;
	MyBroadcastReceiver myBroadcastReceiver;
	LocalBroadcastManager lbm;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		/*
		 * LocalBroadcastManager為單例模式
		 * 在應用程式任何地方均可呼叫LocalBroadcastManager.getInstance(context)獲取唯一例項
		 * 如果想要用於接收廣播
		 * 那麼就要將LocalBroadcastManager定義在有效的生命週期內
		 */
		lbm = LocalBroadcastManager.getInstance(this);
		
		myBroadcastReceiver = new MyBroadcastReceiver();
		
		IntentFilter filter = new IntentFilter();  
		filter.addAction("com.plusjun.test.hahaha");
		
		//註冊接收器以及過濾規則
		lbm.registerReceiver(myBroadcastReceiver, filter);
		
		button1 = (Button)findViewById(R.id.button1);
		button1.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent();    
				intent.setAction("com.plusjun.test.hahaha");    
				intent.putExtra("name", "plus"); 
				//傳送廣播
				lbm.sendBroadcast(intent);
			}
		});
	}
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		//別忘了解除接收器
		lbm.unregisterReceiver(myBroadcastReceiver);
	}
}

MyBroadcastReceiver
public class MyBroadcastReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		String str = intent.getStringExtra("name");
		sLog(str);
	}
	
	private void sLog(String str) {
		Log.i("MyBroadcastReceiver", str);
	}
}

和 BroadcastReceiver 註冊與傳送廣播差不多,只是呼叫物件從 Activity 換成了 LocalBroadcastManager。

注意,LocalBroadcastManager 接收器只能通過程式碼註冊(動態註冊),不存在 BroadcastReceiver 的那種AndroidManifest註冊。