本地廣播
前面兩篇文章Android廣播接收器(一)和Android廣播接收器(二)講的都屬于全局廣播,即發出的廣播可以被其他任何應用程序接收到,同樣我們也可以接受來自其他應用程序的廣播,這樣就容易引起安全問題。
利用本地廣播就可以解決廣播的安全問題,這類廣播只能在應用程序的內部進行傳遞,并且廣播接收器也只能接收來自本應用程序發出的廣播。
本地廣播主要就是使用一個LocalBroadcastManager來管理廣播,提供了發送廣播和注冊廣播接收器的方法。接下來通過代碼看看如何實現本地廣播,主要還是通過之前建好的BroadcastTest這個項目來進行測試,修改MainActivity的代碼即可。
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private LocalBroadcastManager localBroadcastManager;
private LocalReceiver localReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
localBroadcastManager = localBroadcastManager.getInstance(this);//獲取實例
intentFilter = new IntentFilter();
intentFilter.addAction("com.feiben.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter);//注冊本地廣播監聽器
Button btnSendBroadcast = (Button) findViewById(R.id.btn_send_broadcast);
btnSendBroadcast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.feiben.broadcasttest.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);//發送本地廣播
}
});
}
@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的實例,然后在注冊以及發送廣播的時候分別調用LocalBroadcastManager的registerReceiver()方法和sendBroadcast()方法。
為了驗證本地廣播只能在BroadcastTest這個程序內傳播,我在BroadcastTest2項目中也來接收com.feiben.broadcasttest.LOCAL_BROADCAST這條廣播。打開BroadcastTest2修改MainActivity的代碼,將原來的靜態注冊廣播改為動態注冊。
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private AnotherBroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("com.feiben.broadcasttest.LOCAL_BROADCAST");
receiver = new AnotherBroadcastReceiver();
registerReceiver(receiver,intentFilter);
}
}
將BroadcastTest2安裝到模擬器上,再啟動BroadcastTest,點擊Send Braodcast這個按鈕,可以看到Toast只顯示了一次,BraodcastTest2接收不到com.feiben.broadcasttest.LOCAL_BROADCAST這條廣播。
本地廣播只能通過動態注冊的方式來接收。
總結一下本地廣播的幾點優勢:
- 本地廣播發送的廣播只能在我們的程序內部傳播,所以不用擔心機密數據泄漏的問題。
- 其他的程序也無法將廣播發送到我們程序的內部,因此不用擔心會有安全漏洞的隱患。
- 發送本地廣播比起發送全局廣播更加高效。
Android廣播接收器的內容就到這里,下一篇文章Android數據存儲(一)將開始介紹Android的數據存儲。由于本人水平有限,如有錯誤,歡迎大家指正。共同學習進步!