LocalBroadcastManager(本地/應用內廣播管理器)
阿新 • • 發佈:2018-12-23
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註冊。