第五章 全局大喇叭,詳解廣播機(jī)制

5.1廣播機(jī)制簡介

廣播分為標(biāo)準(zhǔn)廣播和有序廣播

  • 標(biāo)準(zhǔn)廣播:異步執(zhí)行廣播,廣播發(fā)出后,所有的廣播接收器都會幾乎在同時接收到,沒有先后順序.效率較高,但是無法攔截.
  • 有序廣播:同步執(zhí)行廣播,同一時刻只有一個廣播接收器能夠接收到該廣播,且僅當(dāng)該接收器的邏輯執(zhí)行結(jié)束后再回繼續(xù)傳遞.優(yōu)先級高的先收到廣播消息(同等優(yōu)先級則隨機(jī)選擇一個),前面的接收器可以截斷正在傳播的廣播.

5.2接收系統(tǒng)廣播

廣播接收器可以對自己感興趣的廣播進(jìn)行注冊.注冊廣播分為靜態(tài)注冊和動態(tài)注冊.

  • 動態(tài)注冊:在代碼中注冊.
  • 靜態(tài)注冊:在AndroidManifest.xml中注冊.

onReceive()內(nèi)不允許添加過多邏輯或耗時操作.通常半夜打開其他程序或組件的角色.

  • 廣播接收器中不允許開線程.
  • onReceive()運行時間過程而沒有結(jié)束時,程序會報錯.

5.2.1動態(tài)注冊監(jiān)聽網(wǎng)絡(luò)變化

步驟:
1.新建一個廣播接收器內(nèi)部類.
2.繼承BroadcastReceiver.
3.重寫父類的onReceive(),intenFilter中寫監(jiān)聽的廣播.
注意:

  • 僅在軟件啟動后才有作用.
  • onDestroy()中加上unregiReceive(),用于銷毀接收器.
    示例:
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver,intentFilter);

5.2.2靜態(tài)注冊實現(xiàn)開機(jī)啟動

步驟:
1.新建廣播接收器類.
2.繼承BroadcastReceiver.
3.AndroidManifest.xml中注冊,注冊中填寫監(jiān)聽的廣播.
注意:

  • 該方法可以實現(xiàn)開機(jī)自啟
  • 注冊在<application>內(nèi)
    示例:
<receiver android:name=".BootCompleteReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

5.3發(fā)送自定義廣播

5.3.1發(fā)送標(biāo)準(zhǔn)廣播

步驟:
1.new Intent,參數(shù)為廣播名.
2.sendBroadcast(intent).
注意:

  • 可以在intent中傳遞一些數(shù)據(jù)被廣播接收器.
    示例:
Intent intent = new Intent("com.wjoker.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);

5.3.2發(fā)送有序廣播(和截斷廣播

步驟:
1.發(fā)送廣播使用sendOrderBroadcast().
2.在注冊接收器處加權(quán)限.
3.onReceive()處使用abortBroadcast().(截斷)
步驟:

Intent intent = new Intent("com.wjoker.broadcasttest.MY_BROADCAST");
sendOrderedBroadcast(intent,null);
<receiver android:name=".MyBroadcastReceive">
    <intent-filter android:priority="100">
        <action android:name="com.wjoker.broadcasttest.MY_BROADCAST"/>
    </intent-filter>
</receiver>
public void onReceive(Context context, Intent intent) {
    Toast.makeText(context,"test",Toast.LENGTH_SHORT).show();
    abortBroadcast();
}

5.4使用本地廣播

用于解決安全性問題.只接受本應(yīng)用內(nèi)的廣播或只在本應(yīng)用內(nèi)傳遞.
步驟:
1.通過LocalBroadcastManager對廣播進(jìn)行管理(發(fā)送/接收).
注意:

  • 本地廣播無法通過靜態(tài)方式注冊.
  • 比系統(tǒng)全局廣播效率更高.
    示例:
private LocalBroadcastManager localBroadcastManager;

localBroadcastManager = LocalBroadcastManager.getInstance(this);

Intent intent = new Intent("com.wjoker.broadcasttest.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);//發(fā)送本地廣播
intentFilter = new IntentFilter();
intentFilter.addAction("com.wjoker.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter);// 注冊本地廣播監(jiān)聽器

總結(jié)

1.廣播根據(jù)是否存在接收順序可分為標(biāo)準(zhǔn)廣播和有序廣播;根據(jù)范圍可分為全局廣播和本地廣播.
2.有序廣播可以截斷廣播;本地廣播是安全且高效的.
3.廣播接收器注冊分為動態(tài)注冊(代碼中注冊,啟動后開始監(jiān)聽)和靜態(tài)注冊(AndroidManifest.xml中注冊,隨時監(jiān)聽).
4.onReceive()中不允許開多線程且運行過長會報錯.
5.動態(tài)注冊的監(jiān)聽內(nèi)容在interFace.addAction()中添加,靜態(tài)注冊在<action>中添加.
6.要銷毀接收器.
7.發(fā)送標(biāo)準(zhǔn)廣播,使用sendBroadcast(intent).
8.發(fā)送有序廣播使用sendOrderBroadcast(intent),要在接收器里設(shè)置優(yōu)先級.
9.使用abortBroadcast()截斷廣播(僅有序).
10.本地廣播使用LocalBroadcastManager管理(接收/發(fā)送).

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铸题,一起剝皮案震驚了整個濱河市彻消,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚣抗,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佩捞,死亡現(xiàn)場離奇詭異戏罢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)耐亏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缚柏,“玉大人苹熏,你說我怎么就攤上這事。” “怎么了轨域?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵袱耽,是天一觀的道長。 經(jīng)常有香客問我干发,道長朱巨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任枉长,我火速辦了婚禮冀续,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘必峰。我一直安慰自己洪唐,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布吼蚁。 她就那樣靜靜地躺著凭需,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肝匆。 梳的紋絲不亂的頭發(fā)上粒蜈,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音旗国,去河邊找鬼枯怖。 笑死,一個胖子當(dāng)著我的面吹牛能曾,可吹牛的內(nèi)容都是我干的度硝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼寿冕,長吁一口氣:“原來是場噩夢啊……” “哼塘淑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蚂斤,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎槐沼,沒想到半個月后曙蒸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡岗钩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年纽窟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兼吓。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡臂港,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情审孽,我是刑警寧澤县袱,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站佑力,受9級特大地震影響式散,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜打颤,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一暴拄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧编饺,春花似錦乖篷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至石蔗,卻和暖如春罕邀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背养距。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工诉探, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棍厌。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓肾胯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耘纱。 傳聞我的和親對象是個殘疾皇子敬肚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容