一丈氓、簡(jiǎn)介
廣播是一個(gè)典型的發(fā)布-訂閱模式,也叫做觀察者模式强法。最大的特點(diǎn)就是:發(fā)送方并不關(guān)心接收方是否接到數(shù)據(jù)万俗,也不關(guān)心接收方如何處理數(shù)據(jù)。
可以說達(dá)到完全解耦饮怯。
二闰歪、基本要素
廣播的整個(gè)過程有3個(gè)基本要素
- 發(fā)送廣播的
Broadcast
- 接收廣播的
BroadcastReceiver
- 傳遞數(shù)據(jù)的
Intent
三、廣播分類
Android
的廣播分為四類:普通廣播蓖墅、有序廣播课竣、本地廣播和Stick
廣播。
3.1 普通廣播
普通廣播是完全異步的置媳,通過Context
的sendBroadcast()
函數(shù)來發(fā)送于樟,消息的傳遞效率比較高,但所有的receiver
的執(zhí)行順序并不能確定拇囊。
缺點(diǎn):接收者不能將處理結(jié)果傳遞給下一個(gè)接收者迂曲,并且無法終止廣播的Intent
的傳播,直到?jīng)]有與之匹配的廣播接收者為止寥袭。
示例:
第一步:定義一個(gè)廣播接收者
// 接收者
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
第二步:注冊(cè)廣播
注冊(cè)廣播分為靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè)路捧。
靜態(tài)注冊(cè):
<receiver android:name=".broadcast.MyBroadcastReceiver" >
<intent-filter>
<action android:name="my"/>
</intent-filter>
</receiver>
動(dòng)態(tài)注冊(cè):
private void registerMyBroadcast() {
registerReceiver(new MyBroadcastReceiver(), new IntentFilter("my"));
}
第三步:發(fā)送廣播
private void sendNormalBroadcast() {
sendBroadcast(new Intent("my"));
}
如果是在Activity或者Fragment中動(dòng)態(tài)注冊(cè),那么必須在onDestroy()里取消注冊(cè)传黄。
@Override
protected void onDestroy() {
unregisterReceiver(myReceiver);
}
3.2 有序廣播
有序廣播杰扫,見名知意。發(fā)送一個(gè)廣播膘掰,所有的廣播接收者按其優(yōu)先級(jí)從高到低按順序接收章姓。高優(yōu)先級(jí)接收器接收后通過setResult()
將結(jié)果傳給下一個(gè)廣播接收者。下一個(gè)廣播接收者通過getResult()
接收結(jié)果识埋。
如果想要中止廣播的傳遞凡伊,調(diào)用abortBroadcast()
函數(shù)來中止。系統(tǒng)會(huì)丟棄該廣播窒舟。
- 設(shè)置優(yōu)先級(jí)
<receiver android:name=".broadcast.MyBroadcastReceiver" >
<intent-filter>
<action android:name="my" android:priority="100"/>
</intent-filter>
</receiver>
優(yōu)先級(jí)范圍在-1000 - 10000
系忙,數(shù)值越大,優(yōu)先級(jí)越高惠豺。
但實(shí)際上可以設(shè)置優(yōu)先級(jí)為int
的最高值:2147483647
银还。
發(fā)送有序廣播:
private void sendOrderBroadcast() {
sendOrderedBroadcast(new Intent("my"), null);
}
3.3 本地廣播
在Android 5.0
以后风宁,v4
包中新增本地廣播——LocalBroadcastManager
。它與其它廣播的區(qū)別就是它的廣播范圍只在本app
中蛹疯。
使用:
// 注冊(cè)廣播
LocalBroadcastManager().getInstance().registerReceiver(receiver, intentFilter);
// 注銷廣播
LocalBroadcastManager().getInstance().unregisterReceiver(receiver);
// 發(fā)送異步廣播
LocalBroadcastManager().getInstance().sendBroadcast(new Intent("my"));
// 發(fā)送同步廣播
LocalBroadcastManager().getInstance().sendBroadcastSync(new Intent("my"));
阿里的Android
規(guī)范也推薦使用本地廣播杀糯!
3.4 stick廣播
它的特殊之處在于它可以保留最后一條廣播而不消失,會(huì)一直保留下去苍苞。即便有N多接收者接收它也一直存在。除非調(diào)用removeStickyBroadcast()
函數(shù)狼纬。