本地廣播
前面兩篇文章Android廣播接收器(一)和Android廣播接收器(二)講的都屬于全局廣播肺孵,即發(fā)出的廣播可以被其他任何應(yīng)用程序接收到,同樣我們也可以接受來自其他應(yīng)用程序的廣播滩援,這樣就容易引起安全問題。
利用本地廣播就可以解決廣播的安全問題,這類廣播只能在應(yīng)用程序的內(nèi)部進(jìn)行傳遞盏触,并且廣播接收器也只能接收來自本應(yīng)用程序發(fā)出的廣播。
本地廣播主要就是使用一個LocalBroadcastManager來管理廣播块饺,提供了發(fā)送廣播和注冊廣播接收器的方法赞辩。接下來通過代碼看看如何實(shí)現(xiàn)本地廣播,主要還是通過之前建好的BroadcastTest這個項(xiàng)目來進(jìn)行測試,修改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);//獲取實(shí)例
intentFilter = new IntentFilter();
intentFilter.addAction("com.feiben.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter);//注冊本地廣播監(jiān)聽器
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);//發(fā)送本地廣播
}
});
}
@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();
}
}
}
可以看出本地廣播與之前的動態(tài)注冊廣播接收器的方法基本上是一致的辨嗽。不同的只是在先通過LocalBroadcastManager的getInstance()方法得到一個LocalBroadcastManager的實(shí)例,然后在注冊以及發(fā)送廣播的時候分別調(diào)用LocalBroadcastManager的registerReceiver()方法和sendBroadcast()方法淮腾。
為了驗(yàn)證本地廣播只能在BroadcastTest這個程序內(nèi)傳播糟需,我在BroadcastTest2項(xiàng)目中也來接收com.feiben.broadcasttest.LOCAL_BROADCAST這條廣播。打開BroadcastTest2修改MainActivity的代碼,將原來的靜態(tài)注冊廣播改為動態(tài)注冊来破。
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,點(diǎn)擊Send Braodcast這個按鈕徘禁,可以看到Toast只顯示了一次诅诱,BraodcastTest2接收不到com.feiben.broadcasttest.LOCAL_BROADCAST這條廣播。
本地廣播只能通過動態(tài)注冊的方式來接收送朱。
總結(jié)一下本地廣播的幾點(diǎn)優(yōu)勢:
- 本地廣播發(fā)送的廣播只能在我們的程序內(nèi)部傳播娘荡,所以不用擔(dān)心機(jī)密數(shù)據(jù)泄漏的問題。
- 其他的程序也無法將廣播發(fā)送到我們程序的內(nèi)部驶沼,因此不用擔(dān)心會有安全漏洞的隱患炮沐。
- 發(fā)送本地廣播比起發(fā)送全局廣播更加高效。
Android廣播接收器的內(nèi)容就到這里回怜,下一篇文章Android數(shù)據(jù)存儲(一)將開始介紹Android的數(shù)據(jù)存儲大年。由于本人水平有限,如有錯誤玉雾,歡迎大家指正翔试。共同學(xué)習(xí)進(jìn)步!