為了解決廣播的安全性問題靴患,Android引入了本地廣播機(jī)制,使用該機(jī)制發(fā)出的廣播只能在應(yīng)用程序的內(nèi)部進(jìn)行傳遞,并且廣播接收器也只能接收來自本應(yīng)用程序發(fā)出的廣播。
創(chuàng)建接收器
本地廣播是無法通過靜態(tài)注冊的方式來接收的。我們知道靜態(tài)注冊主要是為了在程序未啟動的情況下能接收廣播话侧,而當(dāng)我們發(fā)送本地廣播的時候,程序肯定是已經(jīng)啟動的了闯参,所以我們需要動態(tài)注冊方式創(chuàng)建接收器瞻鹏。
在這里我們創(chuàng)建一個繼承于BroadcastReceiver的類LocalReceiver。onReceive()處理你接收到的廣播內(nèi)容鹿寨,在這里我用Toast來創(chuàng)建一個提示接收到消息的彈窗
public class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText(context,"This is in LocalReceiver",Toast.LENGTH_SHORT).show();
}
}
創(chuàng)建廣播發(fā)送按鈕
在activity_main.xml文件創(chuàng)建一個用于發(fā)送廣播的按鈕
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button
android:id="@+id/send_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send Button"
/>
</LinearLayout>
注冊監(jiān)聽器和發(fā)送廣播
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//獲取實(shí)例
localBroadcastManager = LocalBroadcastManager.getInstance(this);
intentFilter = new IntentFilter("localbroadcast");
localReceiver = new LocalReceiver();
//注冊本地廣播接收器
localBroadcastManager.registerReceiver(localReceiver,intentFilter);
//Send broadcast
Button button = findViewById(R.id.send_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("localbroadcast");
localBroadcastManager.sendBroadcast(intent);
}
});
}
@Override
protected void onDestroy(){
super.onDestroy();
unregisterReceiver(localReceiver);
}
}
首先通過本地廣播管理器LocalBroadcastManager的getInstance()方法獲取一個實(shí)例新博,并分別創(chuàng)建過濾器IntentFilter和自定義接收器LocalReceiver的實(shí)例。給IntentFilter的實(shí)例添加一個action:localbroadcast(接收的廣播的名稱)脚草,然后調(diào)用LocalBroadcastManager的registerReceiver()方法進(jìn)行注冊赫悄,并將LocalReceiver的實(shí)例和IntentFilter的實(shí)例都傳進(jìn)去。這樣本地監(jiān)聽器就創(chuàng)建完成了馏慨。
調(diào)用LocalBroadcastManager的sendBroadcast()發(fā)送本地廣播埂淮。運(yùn)行程序,點(diǎn)擊Send Button按鈕写隶,我們可以看到彈窗顯示“This is in LocalReceiver”倔撞,說明本地廣播發(fā)送和接收成功了。
注銷
當(dāng)然慕趴,我們最后一定不要忘了取消注冊痪蝇。我們可以通過調(diào)用unregisterReceiver()方法來實(shí)現(xiàn)。至此秩贰,Android的標(biāo)準(zhǔn)廣播發(fā)送就完成了霹俺。
優(yōu)勢
1.發(fā)送的廣播只能在本程序內(nèi)傳遞,不必?fù)?dān)心數(shù)據(jù)泄露
2.其它程序廣播無法發(fā)送到本程序的內(nèi)部毒费,不必?fù)?dān)心安全漏洞隱患
3.本地廣播比系統(tǒng)全局廣播更加高效