Android四大基本組件之一侈离,這種組件本質(zhì)上是一種全局的監(jiān)聽器试幽,用于監(jiān)聽系統(tǒng)全局的廣播消息。它可以接收來自系統(tǒng)和應(yīng)用的的廣播卦碾。
由于BroadcastReceiver是一種全局的監(jiān)聽器铺坞,因此它可以非常方便地實現(xiàn)系統(tǒng)不同組件之間的通信起宽。
靜態(tài)廣播注冊監(jiān)聽
- 創(chuàng)建類繼承Broadcast,重寫onReceiver()方法济榨,此方法內(nèi)處理的操作不能超過5s
- 在androidmainfest.xml中添加<receiver>內(nèi)<inter-filter>的<action>
核心代碼
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
throw new UnsupportedOperationException("Not yet implemented");
}
}
Androidmainfest.xml文件中
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.MYBROADCAST"/>
</intent-filter>
</receiver>
優(yōu)點:應(yīng)用不用啟動即可接受到廣播
缺點:耗費cpu坯沪,電量等資源
動態(tài)注冊廣播
- 創(chuàng)建A類繼承BroadcastReceiver,重寫onReceive()方法
- 在需要調(diào)用的類中創(chuàng)建A對象和IntentFilter擒滑,添加對應(yīng)的action
- 調(diào)用registerReceiver()方法進(jìn)行注冊
- activity結(jié)束后調(diào)用unregisterReceiver(receiver)方法移除
//注冊廣播
private SmsReceiver smsReceiver;
smsReceiver=new SmsReceiver();
IntentFilter intentFilter=new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(smsReceiver,intentFilter);
優(yōu)點: 節(jié)省資源腐晾,省電!自由的控制注冊與注銷丐一,靈活性大
缺點:必須在程序啟動后才能接受廣播
廣播的發(fā)送
- 創(chuàng)建Intent對象藻糖,添加對應(yīng)action
- 發(fā)送廣播
//發(fā)送廣播
Intent intent=new Intent();
intent.setAction("android.provider.Telephony.SMS_RECEIVED");
sendBroadcast(intent);//無序廣播
sendOrderBroadcast(intent)//有序廣播
- 無序廣播
- 優(yōu)點:異步處理,效率高
- 缺點:無法將處理的廣播發(fā)給下一個接受者库车。不能停止消息的傳播
- 有序廣播
- 優(yōu)點:消息依次傳遞巨柒,可以將處理的廣播交給下一個接受者,可以停止廣播傳播
- 缺點:效率比較低
前言
因為不管動態(tài)還是靜態(tài)注冊的廣播都會可以收到整個手機(jī)發(fā)送的廣播凝颇,或者本應(yīng)用發(fā)出去的廣播潘拱,其他程序也可以收到。這樣容易引起安全問題拧略。為了防止本應(yīng)用發(fā)帶有關(guān)鍵性數(shù)據(jù)的廣播被截取或者一直接收到辣雞廣播芦岂,本地廣播加入了廣播行列大家庭
本地廣播
- 創(chuàng)建一個LocalBroadcastManger對象,對廣播進(jìn)行管理
- 創(chuàng)建IntentFilter和BrocastReceiver類
- 調(diào)用localbroadmanger進(jìn)行注冊
//注冊
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
IntentFilter filter = new IntentFilter("ABCDEFG.com");
MyReceiver receiver = new MyReceiver();
localBroadcastManager.registerReceiver(receiver,filter);
//發(fā)送
Intent intent = new Intent("ABCDEFG.com");
sendBroadcast(intent);
Tips:仔細(xì)一看垫蛆,其實本地廣播就是動態(tài)注冊廣播的一種禽最,只是通過LocalBroadcastManger來進(jìn)行操作而已