BroadcastReceiver

前言

  • 本篇主要介紹 廣播的類型垮刹、注冊(cè)和發(fā)送廣播信姓、自定義廣播鸵隧、本地廣播等

正文

一、廣播的類型

  • 標(biāo)準(zhǔn)廣播意推,是一種完全異步執(zhí)行的廣播豆瘫,在廣播發(fā)出之后,幾乎所有的廣播接收器會(huì)在同一時(shí)刻接收到這條廣播菊值,不分先后順序外驱,優(yōu)點(diǎn)是效率高,缺點(diǎn)是在廣播的過程中無法被截?cái)?/p>

  • 有序廣播腻窒,是一種同步執(zhí)行的廣播昵宇,在廣播發(fā)出之后,同一時(shí)刻只有一個(gè)廣播接收器能夠收到這條廣播消息儿子,當(dāng)這個(gè)廣播接收器中的邏輯侄子那個(gè)完畢之后瓦哎,廣播才會(huì)繼續(xù)傳遞,根據(jù)優(yōu)先級(jí)分先后順序,優(yōu)先級(jí)高的可以截?cái)嗯c其相鄰的優(yōu)先級(jí)低的廣播

二杭煎、創(chuàng)建一個(gè)廣播接收者

//只需要寫一個(gè)類繼承自 BroadcastReceiver 即可,收到廣播之后會(huì)走 onReceive 方法

public class MyBroadcastReceriver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //注意此方法中不能做耗時(shí)操作卒落,其作用更多是為了打開某個(gè)組件
    }
}

三羡铲、注冊(cè)廣播

第二點(diǎn)只是創(chuàng)建了一個(gè)廣播接收器,具體要接收什么樣的廣播主要是根據(jù)注冊(cè)廣播來決定的儡毕。注冊(cè)廣播分兩種方式也切,各有優(yōu)缺點(diǎn),分別為 動(dòng)態(tài)注冊(cè)和靜態(tài)注冊(cè)

3.1 動(dòng)態(tài)注冊(cè)腰湾,
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        MyBroadcastReceriver myBroadcastReceriver = new MyBroadcastReceriver();
        IntentFilter  filter = new IntentFilter();
        filter.addAction("android.intent.action.NEW_OUTGOING_CALL");
        registerReceiver(myBroadcastReceriver,filter);
  • 如上所示雷恃,動(dòng)態(tài)注冊(cè)了一個(gè)監(jiān)聽外撥電話的廣播,但是要注意费坊,動(dòng)態(tài)注冊(cè)廣播一定要取消注冊(cè)倒槐,一般是在 onDestroy 方法中 調(diào)用 unregisterReceiver(myBroadcastReceriver); 來取消注冊(cè)

  • 動(dòng)態(tài)注冊(cè)可以自由地控制注冊(cè)和取消,比較靈活附井,但是有一個(gè)前提是程序運(yùn)行之后才會(huì)開始接收廣播讨越,如果說讓接收一條手機(jī)開機(jī)的廣播,動(dòng)態(tài)注冊(cè)就不行了永毅,這得需要靜態(tài)注冊(cè)把跨。

3.2 靜態(tài)注冊(cè)

就拿注冊(cè)一個(gè)接收開機(jī)啟動(dòng)的廣播為例

  • 我們用 AndroidStudio 創(chuàng)建一個(gè)廣播之后,AndroidManifest.xml 中會(huì)添加一個(gè)節(jié)點(diǎn)沼死,如下:
        <receiver
            android:name="broadcastreceiver.MyReceiver"
            android:enabled="true"
            android:exported="true">
        </receiver>
  • 我們需要在這個(gè)節(jié)點(diǎn)下添加一條 action 屬性着逐,來表明接收的是什么樣的廣播,如下:
        <receiver
            android:name="broadcastreceiver.MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>

                <action android:name="android.intent.action.BOOT_COMPLETED"></action>

            </intent-filter>

        </receiver>

系統(tǒng)開機(jī)完成之后意蛀,會(huì)發(fā)一條 android.intent.action.BOOT_COMPLETED 廣播耸别,所以我們需要添加這個(gè)廣播

  • 監(jiān)聽手機(jī)開機(jī) 還需要添加一條權(quán)限
   <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
  • 但是靜態(tài)注冊(cè),不能取消

四浸间、發(fā)送自定義廣播

  • 之前我們接收的廣播都是系統(tǒng)定義好的太雨,而實(shí)際項(xiàng)目中,我們很多情況都需要自定義廣播魁蒜。

  • 自定義廣播也是分兩個(gè)步驟囊扳,注冊(cè)廣播和發(fā)送廣播,注冊(cè)廣播也分兩種兜看,靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè)锥咸,跟之前說的完全一樣,只不過是那個(gè) action 由我們自己定義而已

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

就拿動(dòng)態(tài)注冊(cè)來說吧

//注冊(cè)
        MyBroadcastReceriver  myBroadcastReceriver = new MyBroadcastReceriver();
        IntentFilter  filter = new IntentFilter();
        filter.addAction("11111111");
        registerReceiver(myBroadcastReceriver,filter);
//發(fā)送
        Intent intent = new Intent();
        intent.setAction("11111111");
        sendBroadcast(intent);

我們創(chuàng)建一個(gè)廣播之后细移,在某個(gè)邏輯下 添加如上代碼搏予,就表明注冊(cè)了一個(gè) action 為 11111111 的廣播,當(dāng)有人發(fā)送這條廣播的時(shí)候弧轧,我們的 MyBroadcastReceriver 就會(huì)收到該廣播雪侥。

4.2 發(fā)送有序廣播
  • 相對(duì)于標(biāo)準(zhǔn)廣播來說碗殷,只需要在發(fā)送的時(shí)候呢改變一行代碼即可:
sendBroadcast(intent);
//改為
sendOrderedBroadcast(intent,null);
//第二個(gè)參數(shù)表示一個(gè)與權(quán)限相關(guān)的字符串,我們不需要速缨,傳入 null 即可
4.3 設(shè)置廣播優(yōu)先級(jí)锌妻,需要添加一條屬性,如下所示:
<receiver
            android:name="broadcastreceiver.MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter
                android:priority="1000"
                >

                <action android:name="android.intent.action.BOOT_COMPLETED"></action>

            </intent-filter>

        </receiver>

添加了一條 android:priority="1000" 屬性旬牲,其值的范圍在 -1000 和 1000 之間仿粹,數(shù)值越大,優(yōu)先級(jí)越高

4.3 在有序廣播中截?cái)鄰V播
  • 只需要在優(yōu)先級(jí)高的廣播的 onReceive 方法中調(diào)用 abortBroadcast(); 就可截?cái)鄰V播

五原茅、使用本地廣播

  • 之前我們所說的所有廣播都是全局廣播吭历,即發(fā)出的廣播可以被任何應(yīng)用程序接收到,而我們的廣播接收器擂橘,也能接收到來自于其他任何應(yīng)用程序的廣播晌区,特別是我們?cè)诎l(fā)送廣播的時(shí)候攜帶一些重要數(shù)據(jù),這要是被其他人應(yīng)用程序獲取到了通贞,豈不是很不安全契讲,而本地廣播就是為了解決這些問題

  • 本地廣播主要是使用了一個(gè) LocalBroadcastManager 類對(duì)廣播進(jìn)行管理,如下所示:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        
        LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
        //注冊(cè)廣播
        MyBroadcastReceriver myBroadcastReceriver = new MyBroadcastReceriver();
        IntentFilter  filter = new IntentFilter();
        filter.addAction("android.intent.action.NEW_OUTGOING_CALL");
        localBroadcastManager.registerReceiver(myBroadcastReceriver,filter);
        //發(fā)送廣播
        Intent intent = new Intent();
        intent.setAction("11111111");
        localBroadcastManager.sendBroadcast(intent);
  • 本地廣播除了之前的優(yōu)點(diǎn)之外滑频,還有一條就是比全局廣播更加高效
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捡偏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子峡迷,更是在濱河造成了極大的恐慌银伟,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绘搞,死亡現(xiàn)場離奇詭異彤避,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)夯辖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門琉预,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蒿褂,你說我怎么就攤上這事圆米。” “怎么了啄栓?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵娄帖,是天一觀的道長。 經(jīng)常有香客問我昙楚,道長近速,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮削葱,結(jié)果婚禮上奖亚,老公的妹妹穿的比我還像新娘。我一直安慰自己析砸,他們只是感情好遂蛀,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著干厚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪螃宙。 梳的紋絲不亂的頭發(fā)上蛮瞄,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音谆扎,去河邊找鬼挂捅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛堂湖,可吹牛的內(nèi)容都是我干的闲先。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼无蜂,長吁一口氣:“原來是場噩夢啊……” “哼伺糠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起斥季,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤训桶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后酣倾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舵揭,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年躁锡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了午绳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡映之,死狀恐怖拦焚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杠输,我是刑警寧澤耕漱,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站抬伺,受9級(jí)特大地震影響螟够,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一妓笙、第九天 我趴在偏房一處隱蔽的房頂上張望若河。 院中可真熱鬧,春花似錦寞宫、人聲如沸萧福。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲫忍。三九已至,卻和暖如春钥屈,著一層夾襖步出監(jiān)牢的瞬間悟民,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國打工篷就, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留射亏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓竭业,卻偏偏與公主長得像智润,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子未辆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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

  • 使用Android手機(jī)的時(shí)候窟绷,我們的手機(jī)管家中經(jīng)常會(huì)出現(xiàn)開機(jī)自啟動(dòng)某某app,那么對(duì)于這個(gè)某某APP來說咐柜,他是怎么...
    徐愛卿閱讀 5,960評(píng)論 8 14
  • 現(xiàn)實(shí)中的廣播:電臺(tái)為了傳達(dá)一些消息而發(fā)送廣播钾麸,通過廣播攜帶要傳達(dá)的消息,群眾只要買一個(gè)收音機(jī)炕桨,就可以收到廣播了饭尝。 ...
    stevewang閱讀 4,244評(píng)論 0 8
  • 嘴里嚼著人間香糖 不經(jīng)意吐出了黑 寒冬將至 燒幾句詩取暖 烈燃后茍活一團(tuán)黑 沒有黑的白裝著高尚 沒有白的黑背著罵名...
    白日作夢閱讀 182評(píng)論 0 0
  • 有常無常钥平,雙樹枯榮,南北西東姊途,非假非空
    吾乃哲貓閱讀 129評(píng)論 0 0
  • 01. 這已經(jīng)是夏琳站在全身鏡前換的第五套衣服了捷兰,其實(shí)她完全沒必要這樣一套接著一套的換立叛,因?yàn)樗囊路嵗谠趺纯赡苓€...
    俟塵閱讀 792評(píng)論 0 0