BroadCast Receiver 詳解

這里是引用钦睡,本文主要是《第一行代碼》閱讀筆記!由于剛開始學習Android膀估,所以肯定有很多見解不成熟幔亥。希望看到的人能多多指正,有問題的地方可以提在評論察纯,多謝賜教帕棉!

? ? ? ?BroadcastReceiver,廣播接收者饼记。Android四大組件之一香伴,它的本質(zhì)就是一個全局的監(jiān)聽器【咴颍可以監(jiān)聽到各種廣播即纲,包括系統(tǒng)廣播、應用廣播博肋〉驼可以用來實現(xiàn)不同組件之間的通信蜂厅。
? ? ? ?在Android中,廣播可以分為兩大類:標準廣播(Normal broadcasts)和有序廣播(Ordered broadcasts)膊畴。
標準廣播:一種異步執(zhí)行的廣播掘猿,在廣播發(fā)出后所有的接收者幾乎是同一時間接收到廣播。這種廣播效率很高唇跨,但是沒有先后順序所以一位置不能被截斷稠通。
有序廣播:一種同步執(zhí)行的廣播,在廣播發(fā)出后優(yōu)先級最高的廣播接收器可以接收到這條廣播轻绞,當這個廣播接收器中的邏輯執(zhí)行完成以后采记,廣播才會繼續(xù)傳遞。因此如果在優(yōu)先級高的廣播接收器中截斷了正在傳遞的廣播政勃,那么后面的廣播接收器就無法接收到這條廣播唧龄。

發(fā)送廣播的基本步驟:

1.創(chuàng)建需要啟動BroadCastReceiver的Intent
2.調(diào)用Context的sendBroadcast()方法或者sendOrderedBroadcast()方法發(fā)送廣播。其中sendBroadcast()發(fā)送的是標準廣播奸远,sendOrderedBroadcast()發(fā)送的是有序廣播既棺。
標準廣播

Intent intent = new Intent("com.zwf.broadcastdemo.MY_BROADCAST");
sendBroadcast(intent);

有序廣播

Intent intent = new Intent("com.zwf.broadcastdemo.MY_ODERED_BROADCAST");
sendOrderedBroadcast(intent, null);
接收廣播的基本步驟:

我們可以接收自定義的廣播,也可以接收系統(tǒng)的廣播懒叛。系統(tǒng)會發(fā)出很多廣播丸冕,例如開機啟動完成,電量過低等都會發(fā)出廣播薛窥,但是想接收這些廣播需要聲明權(quán)限胖烛。

1.創(chuàng)建一個類繼承自BroadCastReceiver,重寫父類的onReceive()方法诅迷。這樣當消息來了佩番,就會執(zhí)行onReceive()方法中的邏輯。
2.注冊BroadcastReceiver罢杉,實現(xiàn)了BroadcastReceiver需要注冊一下趟畏,有兩種方式:

  • 動態(tài)注冊:這種方法是通過java代碼注冊。這種注冊方式注冊的廣播接收者為非駐型廣播滩租,它會隨著Activity的生命周期變化赋秀,所以在Activity推出的時候我們需要調(diào)用unregisterReceiver(netWorkBroadCastReceiver)方法取消注冊。下面是注冊代碼:
intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
netWorkBroadCastReceiver = new NetWorkBroadCastReceiver();
registerReceiver(netWorkBroadCastReceiver, intentFilter);
  • 靜態(tài)注冊:這種方法是通過AndroidManifest.xml文件注冊律想。通過這種方式注冊的廣播為常駐型廣播猎莲,也就是說如果應用程序關(guān)閉了,有相應事件觸發(fā)蜘欲,程序還是會被系統(tǒng)自動調(diào)用運行益眉。這樣可以做到程序還沒運行,就可以實現(xiàn)某個廣播的接收注冊姥份,比如開機啟動廣播郭脂。
<!-- 靜態(tài)注冊廣播接收者(此時的接收者不能是內(nèi)部類) -->
<receiver android:name=".BootCompleteReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>
BroadCastReceiver的生命周期

這一塊內(nèi)容主要是參考的這位同學的博客,其實對于何時使用service還不是很了解澈歉≌辜Γ可能下一部分內(nèi)容是看服務!

? ? ? ?BroadcastReceiver的生命周期埃难,從對象調(diào)用它開始莹弊,到onReceiver方法執(zhí)行完成之后結(jié)束。另外涡尘,每次廣播被接收后會重新創(chuàng)建BroadcastReceiver對象忍弛,并在onReceiver方法中執(zhí)行完就銷毀,如果BroadcastReceiver的onReceiver方法中不能在10秒內(nèi)執(zhí)行完成考抄,Android會出現(xiàn)ANR異常细疚。所以不要在BroadcastReceiver的onReceiver方法中執(zhí)行耗時的操作。
如果需要在BroadcastReceiver中執(zhí)行耗時的操作川梅,可以通過Intent啟動Service來完成疯兼。但不能綁定Service。

特別是贫途,您可能無法從一個BroadcastReceiver中顯示一個對話框吧彪,或綁定到服務。對于前者丢早,則應該使用NotificationManager的API姨裸。對于后者,你可以使用Context.startService()來啟動一個Service怨酝。

本地廣播

? ? ? ?前面所發(fā)送和接收的所用廣播都屬于系統(tǒng)的全局廣播傀缩,我們發(fā)出的這些廣播可以給系統(tǒng)中任何應用程序接收到,當然我們也可以接受其他應用程序的廣播凫碌。但是扑毡,只用本地廣播機制發(fā)出的廣播只能在本應用程序中接收到。這樣的話安全性得到了提升盛险。本地廣播機制主要是用LocalBroadcastManager來管理瞄摊,它提供了發(fā)送廣播的方法sendBroadcast()和sendBroadcastSync()(這也方法好像用的不多,我暫時沒有深究苦掘,等以后真正用到可以查一下)换帜,注冊接收者的方法registerReceiver(localReceiver, localIntentTilter),需要兩個參數(shù),取消注冊的方法localBroadcastManager.unregisterReceiver(localReceiver);

下面看一下本地廣播機制的工作流程:
1.發(fā)送本地廣播

 //發(fā)送本地廣播
localBroadcastManager = LocalBroadcastManager.getInstance(this); //獲取本地廣播管理實例
localCastBtn = (Button) findViewById(R.id.local_btn);
localCastBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //發(fā)送本地廣播
        Intent intent = new Intent("com.zwf.broadcastdemo.LOCAL_BROADCAST");
        localBroadcastManager.sendBroadcast(intent);
    }
});

2.注冊廣播接收者

//注冊本地廣播監(jiān)聽
localIntentTilter = new IntentFilter("com.zwf.broadcastdemo.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, localIntentTilter);

3.取消注冊

//取消本地廣播監(jiān)聽
localBroadcastManager.unregisterReceiver(localReceiver);

關(guān)于BroadCastReceiver就總結(jié)這么多鹤啡,等以后實際項目用到的話知道有這么一個用法惯驼,其他再去查。有新記錄會及時補充。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祟牲,一起剝皮案震驚了整個濱河市隙畜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌说贝,老刑警劉巖议惰,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乡恕,居然都是意外死亡言询,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門傲宜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來运杭,“玉大人,你說我怎么就攤上這事函卒×俱荆” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵谆趾,是天一觀的道長躁愿。 經(jīng)常有香客問我,道長沪蓬,這世上最難降的妖魔是什么彤钟? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮跷叉,結(jié)果婚禮上逸雹,老公的妹妹穿的比我還像新娘。我一直安慰自己云挟,他們只是感情好梆砸,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著园欣,像睡著了一般帖世。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沸枯,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天日矫,我揣著相機與錄音,去河邊找鬼绑榴。 笑死哪轿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的翔怎。 我是一名探鬼主播窃诉,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼杨耙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了飘痛?” 一聲冷哼從身側(cè)響起珊膜,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敦冬,沒想到半個月后辅搬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唯沮,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡脖旱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了介蛉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萌庆。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖币旧,靈堂內(nèi)的尸體忽然破棺而出践险,到底是詐尸還是另有隱情,我是刑警寧澤吹菱,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布巍虫,位于F島的核電站,受9級特大地震影響鳍刷,放射性物質(zhì)發(fā)生泄漏占遥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一输瓜、第九天 我趴在偏房一處隱蔽的房頂上張望瓦胎。 院中可真熱鬧,春花似錦尤揣、人聲如沸搔啊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽负芋。三九已至,卻和暖如春嗜愈,著一層夾襖步出監(jiān)牢的瞬間旧蛾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工芝硬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚜点,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓拌阴,卻偏偏與公主長得像绍绘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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