前面我們傳送和接收的廣播全部都是屬於系統全域性廣播,即發出的廣播可以被其他任何 的任何應用程式接收到,並且我們也可以接收來自於其他任何應用程式的廣播。這樣就很容 易會引起安全性的問題,比如說我們傳送的一些攜帶關鍵性資料的廣播有可能被其他的應用程式截獲,或者其他的程式不停地向我們的廣播接收器裡傳送各種垃圾廣播。
為了能夠簡單地解決廣播的安全性問題,Android 引入了一套本地廣播機制,使用這個 機制發出的廣播只能夠在應用程式的內部進行傳遞,並且廣播接收器也只能接收來自本應用 程式發出的廣播,這樣所有的安全性問題就都不存在了。
本地廣播的用法並不複雜,主要就是使用了一個 LocalBroadcastManager 來對廣播進行 管理,並提供了傳送廣播和註冊廣播接收器的方法。下面我們就通過具體的例項來嘗試一下 它的用法,修改 MainActivity 中的程式碼,如下所示:
public class MainActivity extends Activity { private IntentFilter intentFilter; private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
localBroadcastManager = LocalBroadcastManager.getInstance(this);
// 獲取例項
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.broadcasttest. LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent); // 傳送本地廣播
}
});
intentFilter = new IntentFilter(); intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST"); localReceiver = new LocalReceiver(); localBroadcastManager.registerReceiver(localReceiver, intentFilter);// 註冊本地廣播監聽器
}
@Override
protected void onDestroy() {
super.onDestroy();
localBroadcastManager.unregisterReceiver(localReceiver);
}
class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) { Toast.makeText(context, "received local broadcast",
Toast.LENGTH_SHORT).show();
}
}
}
有沒有感覺這些程式碼很熟悉?沒錯,其實這基本上就和我們前面所學的動態註冊廣播接 收器以及傳送廣播的程式碼是一樣。只不過現在首先是通過 LocalBroadcastManager 的 getInstance() 方法得到了它的一個例項,然後在註冊廣播接收器的時候呼叫的是 LocalBroadcastManager 的 registerReceiver()方法,在傳送廣播的時候呼叫的是 LocalBroadcastManager 的 sendBroadcast() 方法,僅此而已。這裡我們在按鈕的點選事件裡面發出了一條 com.example.broadcasttest. LOCAL_BROADCAST 廣播,然後在 LocalReceiver 裡去接收這條廣播。重新執行程式,並 點選 Send Broadcast 按鈕,效果如圖 5.9 所示。
圖 5.9
可以看到,LocalReceiver 成功接收到了這條本地廣播,並通過 Toast 提示了出來。如果你還有興趣進行實驗,可以嘗試在 BroadcastTest2 中也去接收 com.example.broadcasttest. LOCAL_BROADCAST 這條廣播,答案是顯而易見的,肯定無法收到,因為這條廣播只會在 BroadcastTest 程式內傳播。
另外還有一點需要說明,本地廣播是無法通過靜態註冊的方式來接收的。其實這也完全 可以理解,因為靜態註冊主要就是為了讓程式在未啟動的情況下也能收到廣播,而傳送本地 廣播時,我們的程式肯定是已經啟動了,因此也完全不需要使用靜態註冊的功能。
最後我們再來盤點一下使用本地廣播的幾點優勢吧。
1. 可以明確地知道正在傳送的廣播不會離開我們的程式,因此不需要擔心機密資料洩 漏的問題。
2. 其他的程式無法將廣播傳送到我們程式的內部,因此不需要擔心會有安全漏洞的隱 患。
3. 傳送本地廣播比起傳送系統全域性廣播將會更加高效。