1.BroadCastReceiver概述
- 說起這個組件,就不得不提到廣播了垫毙。廣播是應(yīng)用程序之間傳輸信息的機制综芥。是為了方便數(shù)據(jù)的通信膀藐,例如監(jiān)聽一些廣播,如來電栏笆、來短信等臊泰。
-
廣播的流程:發(fā)送—>接收缸逃。** 一個發(fā)送需频,多個接收筷凤。**
如圖
broadcast
2 流程
2.1 發(fā)送
普通廣播挪丢、有序廣播
廣播分類 | 發(fā)送方法 |
---|---|
普通廣播 | Context.sendBroadcast() |
有序廣播 | Context.sendOrderedBroadcast() |
- 普通廣播有以下特性:
- 它是完全異步的乾蓬。
- 所有的receivers接收器的執(zhí)行順序不確定任内。因此,所有的receivers接收器接收broadcast的順序不確定趋距。
- 這種方式效率更高节腐!
代碼如下:
Intent intent = new Intent(“com.app.bc.test”);
sendBroadcast(intent);//發(fā)送廣播事件
- 有序廣播有以下特性:
- BroadcastReceiver可以使用setResult系列函數(shù)來結(jié)果傳給下一個 BroadcastReceiver廊敌,通過getResult系列函數(shù)來取得上個BroadcastReceiver返回的結(jié)果骡澈,并可以abort系列函數(shù)來讓系統(tǒng)丟棄該廣播讓肋殴,使用該廣播不再傳送到別的BroadcastReceiver护锤。
- BroadcastReceiver擁有優(yōu)先級屬性,即android:priority="100"驱入,取值范圍為1000~-1000亏较,數(shù)值越大雪情,優(yōu)先級別就越高你辣。
Intent intent = new Intent(“com.app.bc.test”);
sendOrderedBroadcast(intent,null);//發(fā)送廣播事件
2.2 接收
- 接收:BroadcastReceiver巡通,會調(diào)用它的onReceive()方法,并將包含消息的Intent對象傳給它舍哄。onReceive()方法生命周期只有10秒宴凉,即不要在這里執(zhí)行太長的任務(wù)。(這里確確實實是10秒表悬,我專門翻墻看了官方文檔0.0)
class MyBroadcastReceiver extends BroadcastReceiver {
//接收到廣播會被自動調(diào)用
@Override
public void onReceive (Context context, Intent intent) {
//從Intent中獲取action
…your code here…
}
}
3 注冊與過濾器
- 注冊:正如Activity使用一樣跪解,broadcast同樣需要注冊。
- 過濾器:不可能所有的廣播都要接收,所以便有了過濾器叉讥,區(qū)別所有的廣播的就是aciton了窘行,有官方和自定義的。
靜態(tài)注冊图仓、動態(tài)注冊
- 靜態(tài)注冊:在AndroidManifest.xml注冊罐盔。因為它是四大組件之一救崔,所以它的位置和Activity同級。
<application>
<activity name=""/>
<receiver android:name=".MyBroadcastReceiver">
<!-- intent過濾器,指定可以匹配哪些intent, 一般需要定義action 可以是自定義的也可是系統(tǒng)的 -->
<intent-filter>
<action android:name="com.app.bc.test"/> <!--action作為過濾的唯一判定標準-->
</intent-filter>
</receiver>
</application>
- 動態(tài)注冊:
SMSReceiver smsReceiver = new SMSReceiver();
IntentFilter filter = new IntentFilter(); //新建一個intent過濾器
filter.addAction(“android.provider.Telephony.SMS_RECEIVED”); //加入action
TestBC1Activity.this.registerReceiver(smsReceiver, filter); //注冊
- 區(qū)別
- 靜態(tài)注冊:在AndroidManifest.xml注冊主巍,android不能自動銷毀廣播接收器逛艰,也就是說當(dāng)應(yīng)用程序關(guān)閉后肄渗,還是會接收廣播丹诀。
- 動態(tài)注冊:在代碼中通過registerReceiver()手工注冊。當(dāng)程序關(guān)閉時,該接收器也會隨之銷毀。當(dāng)然衙伶,也可手工調(diào)用unregisterReceiver()進行銷毀。
4.總結(jié)
方法 | 含義 |
---|---|
sendBroadcast | 發(fā)送普通廣播 |
sendOrderedBroadcast | 發(fā)送有序廣播 |
onReceive | 接收廣播后調(diào)用 |
intent-filter | 靜態(tài)注冊的過濾器 |
priority | 有序廣播優(yōu)先級 |
filter.addAction | 動態(tài)注冊過濾器添加 action |
registerReceiver | 動態(tài)注冊 |
unregisterReceiver() | 手動銷毀 |