- 廣播的發(fā)送:通過(guò)intent比默; 廣播的接收:通過(guò)廣播接收者(Broadcast Receiver)
- 廣播的分類(lèi):無(wú)序廣播和有序廣播
- 無(wú)序廣播:無(wú)法被截?cái)?/li>
- 有序廣播:按順序發(fā)送廣播,優(yōu)先級(jí)高的先接收到廣播,并且可以中斷廣播的傳遞僚饭,后面的廣播接收器將無(wú)法接收到廣播
- 注冊(cè)廣播的兩種方式
- 動(dòng)態(tài)注冊(cè):代碼中注冊(cè)
- 靜態(tài)注冊(cè):清單文件中注冊(cè)
- 動(dòng)態(tài)注冊(cè)廣播
新建一個(gè)類(lèi),讓它繼承BroadcastRecevier市怎,重寫(xiě)onReceive()來(lái)接收廣播犀填,在activity中通過(guò)registerReceiver(receiver,intentFilter)來(lái)注冊(cè), unregisterReceiver()來(lái)反注冊(cè)超升,一般在activity的onDestroy()方法中來(lái)取消接收廣播 - 案例1 接收網(wǎng)絡(luò)狀態(tài)發(fā)生變化時(shí)的系統(tǒng)廣播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(myReceiver,intentFilter);
注意需要在清單文件中聲明權(quán)限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- 案例2 靜態(tài)注冊(cè)開(kāi)機(jī)廣播
權(quán)限:<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
清單文件中添加<receiver>以及<intent-filter>中指定action - 注意事項(xiàng):不要在onReceive()方法中添加過(guò)多的邏輯或者耗時(shí)操作入宦,以免ANR
- 發(fā)送自定義廣播
- 發(fā)送標(biāo)準(zhǔn)廣播 sendBroadcast();
Intent intent = new Intent("com.evan.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
廣播發(fā)送出去哺徊,需要自己寫(xiě)一個(gè)廣播接收者來(lái)接收這個(gè)自定義的廣播
9. 發(fā)送有序廣播:sendOrderedBroadcast();這樣發(fā)送的就是有序廣播,在清單文件中的過(guò)濾器中設(shè)置的權(quán)限越大(如android:priority="100")乾闰,就優(yōu)先接收到廣播落追,接收到廣播后終止廣播:`abortBroadcast();`
10. 本地廣播:為了安全性,發(fā)出的廣播只能在程序內(nèi)部傳遞涯肩,其他應(yīng)用程序無(wú)法接收到廣播轿钠,也無(wú)法接收到其他程序發(fā)送的廣播
- 通過(guò)LocalBroadcastManager來(lái)發(fā)送廣播和注冊(cè)廣播接收者
Intent intent = new Intent("com.evan.broadcasttest.MY_BROADCAST");
// sendBroadcast(intent);
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
localBroadcastManager.sendBroadcast(intent);
注冊(cè)廣播接收器
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.evan.broadcasttest.MY_BROADCAST");
localBroadcastManager.registerReceiver(myReceiver,intentFilter);
- 注意:本地廣播無(wú)法通過(guò)靜態(tài)注冊(cè)來(lái)接收廣播