Android寶典|BroadcastReceiver必考知識(shí)點(diǎn)總結(jié)

目錄

  1. 思維導(dǎo)圖
  2. 概述
  3. 注冊方式
    • 靜態(tài)注冊
    • 動(dòng)態(tài)注冊
  4. 廣播分類
    • 普通廣播
    • 系統(tǒng)廣播
    • 有序廣播
    • 粘性廣播
    • 應(yīng)用內(nèi)廣播
  5. 參考

思維導(dǎo)圖

image

概述

在 Android 系統(tǒng)中吠撮,廣播是在組件之間傳遞數(shù)據(jù)的一種機(jī)制,這些組件可以位于不同的進(jìn)程中屁倔,起到進(jìn)程間通信的作用票罐。

BroadcastReceiver 是對(duì)發(fā)送出來的廣播進(jìn)行過濾叉趣、接收和響應(yīng)的組件,首先將要發(fā)送的消息和用于過濾的信息(action该押、category)裝入一個(gè) Intent 對(duì)象疗杉,然后通過調(diào)用 Context.sendBroadcast() 或 Context.sendOrderBoradcast() 方法把 Intent 對(duì)象以廣播形式發(fā)送出去。廣播發(fā)送出去后蚕礼,所有已注冊的 BroadcastReceiver 會(huì)檢查注冊時(shí)的 IntnetFilter 是否與發(fā)送的 Intent 相匹配烟具,若匹配則會(huì)調(diào)用 BroadcastReceiver 的 onReceiver 方法。

BroadcastReceiver 的生命周期很短闻牡,一旦 onReceiver 執(zhí)行完畢净赴,生命周期就結(jié)束了。

注冊方式

廣播的注冊分為靜態(tài)注冊和動(dòng)態(tài)注冊罩润。

不管靜態(tài)注冊還是動(dòng)態(tài)注冊玖翅,首先得有廣播呀:

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (!TextUtils.isEmpty(intent.getStringExtra("name"))){
            Toast.makeText(context, intent.getStringExtra("name"), Toast.LENGTH_SHORT).show();
        }
    }
}
靜態(tài)注冊

靜態(tài)注冊即指在 AndroidManifest 里面注冊。應(yīng)用一旦啟動(dòng)割以,它就會(huì)常駐進(jìn)程金度,不受任何組件的生命周期影響,即使應(yīng)用程序關(guān)閉后严沥,仍能接收廣播猜极,耗電同時(shí)占內(nèi)存。

        <receiver android:name=".broadcast.MyBroadcastReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="demo"/>
            </intent-filter>
        </receiver>
      mButton.setOnClickListener(new ClickListenerWrapper(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("demo");
                intent.putExtra("name", "Omooo");
                sendBroadcast(intent);
            }
        }));

注意:

靜態(tài)注冊在 Android 8 上已經(jīng)完全失效了消玄,所以不建議在使用靜態(tài)注冊跟伏。

動(dòng)態(tài)注冊

動(dòng)態(tài)注冊即在代碼中通過調(diào)用 Context.registerReceiver(BroadcastReceiver,IntentFilter) 來注冊,它有幾個(gè)重載方法翩瓜,但是都會(huì)有這兩個(gè)參數(shù)受扳。一般建議在 Activity 的 onResume 注冊,在 onPause 中注銷兔跌,避免內(nèi)存泄露勘高。同時(shí)也不允許重復(fù)注冊、重復(fù)注銷。

    private MyBroadcastReceiver mBroadcastReceiver;

    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter filter = new IntentFilter();
        filter.addAction("demo");
        mBroadcastReceiver = new MyBroadcastReceiver();
        registerReceiver(mBroadcastReceiver, filter);
    }

    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(mBroadcastReceiver);
    }

廣播分類

廣播可以分為五類:普通廣播华望、系統(tǒng)廣播蕊蝗、有序廣播、粘性廣播和應(yīng)用內(nèi)廣播赖舟。

普通廣播

即開發(fā)者自定義的廣播蓬戚,也是最常用的廣播,上面的實(shí)例就是普通廣播建蹄。

系統(tǒng)廣播

Android 中內(nèi)置了多個(gè)系統(tǒng)廣播:只要涉及到手機(jī)的基本操作(如開關(guān)機(jī)碌更、網(wǎng)絡(luò)狀態(tài)變化、拍照等待)洞慎,都會(huì)發(fā)出相應(yīng)的廣播。常用的有:

系統(tǒng)操作 action
監(jiān)聽網(wǎng)絡(luò)變化 android.net.conn.CONNECTIVITY_CHANGE
電池電量低 Intent.ACTION_BATTERY_LOW
成功安裝APK Intent.ACTION_PACKAGE_
... ...

上面我們自己隨便寫的 action="demo"嘿棘,所以每次發(fā)送廣播需要自己手動(dòng)調(diào)用 sendBroadcast劲腿,這時(shí)候可以攜帶數(shù)據(jù)過去,而系統(tǒng)廣播并不能自己傳遞數(shù)據(jù)鸟妙。

有序廣播

有序是針對(duì)廣播接收者來說的焦人,前面的實(shí)例,廣播發(fā)出去之后重父,所有滿足條件的廣播接收者都能通知接收廣播花椭。有序廣播則是按照廣播接收者的 priority 屬性值從大到小排序依次接收,同 priority 的動(dòng)態(tài)廣播優(yōu)先于靜態(tài)廣播房午。同時(shí)矿辽,前一個(gè)廣播接收器也可以通過調(diào)用 abortBroadcast() 方法截?cái)鄰V播,這樣優(yōu)先級(jí)低的廣播接收者就無法接收到廣播了郭厌,也可以修改數(shù)據(jù)傳遞袋倔,這就帶來了安全性問題。

前面說過折柠,強(qiáng)烈不建議使用靜態(tài)注冊宾娜,而 priority 屬性就是在 xml 文件里面配置的。

發(fā)送有序廣播使用:

sendOrderedBroadcast(Intent intent, String receiverPermission)
粘性廣播

在 Android 5.0 上已經(jīng)失效扇售,不建議使用前塔。

應(yīng)用內(nèi)廣播

之前發(fā)送和接收到的廣播全都是屬于系統(tǒng)全局廣播,即發(fā)出的廣播可以被其他應(yīng)用接收到承冰,而且也可以接收到其他應(yīng)用發(fā)送出的廣播华弓,這樣可能會(huì)有不安全因素。

當(dāng)不需要通過 sendBroadcast 來完成跨應(yīng)用的通信巷懈,那么建議使用 LocalBroadcastManager该抒,將會(huì)是更加高效、安全的方式,并且對(duì)系統(tǒng)帶來的影響也更小凑保。

BroadcastReceiver 采用的 Binder 方式實(shí)現(xiàn)跨進(jìn)程通信冈爹,而 LocalBroadcastManager 使用 Handler 通信機(jī)制。

函數(shù) 作用
LocalBroadcastManager.getInstance(this).registerReceiver(BroadcastReceiver,IntentFilter) 注冊 Receiver
LocalBroadcastManager.getInstance(this).unregisterReceiver(BroadcastReceiver,IntentFilter) 注銷 Receiver
LocalBroadcastManager.getInstance(this).sendBroadcast(Intent) 發(fā)送異步廣播
LocalBroadcastManager.getInstance(this).sendBroadcastSync(Intent) 發(fā)送同步廣播

注意欧引,應(yīng)用內(nèi)廣播只能是動(dòng)態(tài)注冊频伤。

參考

Android四大組件:BroadcastReceiver史上最全面解析

Android BroadcastReceiver使用詳解

LocalBroadcastManager原理分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芝此,隨后出現(xiàn)的幾起案子憋肖,更是在濱河造成了極大的恐慌,老刑警劉巖婚苹,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岸更,死亡現(xiàn)場離奇詭異,居然都是意外死亡膊升,警方通過查閱死者的電腦和手機(jī)怎炊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來廓译,“玉大人行冰,你說我怎么就攤上這事重贺。” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵邻吞,是天一觀的道長氛悬。 經(jīng)常有香客問我克锣,道長甘有,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任歹垫,我火速辦了婚禮剥汤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘排惨。我一直安慰自己吭敢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布暮芭。 她就那樣靜靜地躺著鹿驼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辕宏。 梳的紋絲不亂的頭發(fā)上畜晰,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音瑞筐,去河邊找鬼凄鼻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的块蚌。 我是一名探鬼主播闰非,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼峭范!你這毒婦竟也來了财松?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤纱控,失蹤者是張志新(化名)和其女友劉穎辆毡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甜害,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舶掖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唾那。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片访锻。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖闹获,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情河哑,我是刑警寧澤避诽,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站璃谨,受9級(jí)特大地震影響沙庐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜佳吞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一拱雏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧底扳,春花似錦铸抑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至阱冶,卻和暖如春刁憋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背木蹬。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國打工至耻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓尘颓,卻偏偏與公主長得像走触,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泥耀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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