Android學習筆記4 四大組件之BroadcastReceiver

Android系統(tǒng)四大組件播聪,Activity(活動)提供界面負責用戶交互,Service(服務)沒有用戶界面主要是在后臺執(zhí)行任務布隔,Content Provider(內(nèi)容提供者)用于不同應用間數(shù)據(jù)共享离陶,今天介紹的是最后一個,BroadcastReceiver(廣播接收器)衅檀。

一招刨、 BroadcastReceiver是什么
二、 BroadcastReceiver基本用法
三哀军、 BroadcastReceiver例子
四沉眶、 BroadcastReceiver總結(jié)

一打却、 BroadcastReceiver是什么

簡單來說,BroadcastReceiver廣播接收器就是一個全局的監(jiān)聽器谎倔,它可以監(jiān)聽用戶自己開發(fā)的程序和系統(tǒng)的發(fā)出的廣播消息柳击。具體來說,我們的手機在使用過程中肯定會經(jīng)歷很多的狀態(tài)片习,比如電池電量低捌肴、系統(tǒng)的時間變化、系統(tǒng)收到短信等等藕咏,這些狀態(tài)發(fā)生時系統(tǒng)會對外發(fā)送標準廣播状知,我們通過繼承BroadcastReceiver新建自己的廣播接收器來監(jiān)聽這些標準廣播,即可在特定的時候完成指定的操作侈离。

二试幽、 BroadcastReceiver基本用法

這里先假設我們是自己要發(fā)送條廣播,那么我們首先要做的是創(chuàng)建Intent對象卦碾,在Intent里使用setAction方法來設置通知的標識铺坞,用以區(qū)分廣播,同時可以在Intent里攜帶數(shù)據(jù)洲胖,最后調(diào)用方法sendBroadcast來發(fā)送廣播济榨。

1.發(fā)送廣播

下面的代碼展示了發(fā)送廣播,代碼的邏輯就是點擊按鈕時發(fā)送一條廣播绿映。

public class BroadcastActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.layout_activity_bc);

        //點擊按鈕時
        Button btnSendBC = (Button) findViewById(R.id.btn_send_bc);
        btnSendBC.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //實例化Intent
                Intent mIntent = new Intent();
                //設置標識
                mIntent.setAction("com.jackaltsc.android.actiontest");
                //攜帶數(shù)據(jù)
                mIntent.putExtra("msg", "自定義的廣播消息");
                //開始發(fā)送
                sendBroadcast(mIntent);

            }
        });
    }
}

2.接收廣播

為了接收到廣播擒滑,必須新建繼承BroadcastReceiver的子類,在里面實現(xiàn)onReceive方法來處理邏輯叉弦。

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        Log.e("---bbb---", "接收到廣播內(nèi)容為:" + intent.getStringExtra("msg"));

    }
}

3.注冊廣播

我們有廣播發(fā)送丐一,有廣播接收,那么怎么把兩者關聯(lián)起來呢淹冰?這時库车,就需要在清單文件里對接收器進行注冊。

        <!--接收器-->
        <receiver android:name=".receiver.MyReceiver">
            <intent-filter>
                <action android:name="com.jackaltsc.android.actiontest"/>
            </intent-filter>
        </receiver>

可以看到樱拴,我們把接收器和發(fā)送廣播時的標識關聯(lián)了起來柠衍,這樣廣播接收器就可以接收到通知了。

輸出結(jié)果如下:

輸出結(jié)果

補充一點晶乔,我們在第三步是在清單文件里注冊廣播的珍坊,這里還有另外一種方法是在代碼里設置。我們修改之前的Activity里的代碼正罢,同時刪除掉清單文件里的Receiver注冊的部分代碼阵漏,同樣可以看到結(jié)果。

public class BroadcastActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.layout_activity_bc);

        //點擊按鈕時
        Button btnSendBC = (Button) findViewById(R.id.btn_send_bc);
        btnSendBC.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //過濾器
                IntentFilter filter = new IntentFilter("com.jackaltsc.android.actiontest");
                //實例化
                MyReceiver myReceiver = new MyReceiver();
                //注冊接收器
                registerReceiver(myReceiver, filter);

                //實例化Intent
                Intent mIntent = new Intent();
                //設置標識
                mIntent.setAction("com.jackaltsc.android.actiontest");
                //攜帶數(shù)據(jù)
                mIntent.putExtra("msg", "自定義的廣播消息");
                //開始發(fā)送
                sendBroadcast(mIntent);

            }
        });
    }
}

三、 BroadcastReceiver例子

前面我們提到履怯,系統(tǒng)在很多特定的時候會發(fā)送一些廣播川无,我們選擇特定的廣播進行處理,可以實現(xiàn)我們的需要虑乖。

下面展示下怎么獲取手機短信內(nèi)容。

1.新建廣播接收器

public class MessageReceiver extends BroadcastReceiver {

    private final String action = "android.provider.Telephony.SMS_RECEIVED";

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals(action)) {

            abortBroadcast();

            //用來存放結(jié)果的字符串
            StringBuilder sb = new StringBuilder();

            //取出信息內(nèi)容的載體
            Bundle bundle = intent.getExtras();

            //如果內(nèi)容不為空
            if (bundle != null) {

                //得到信息內(nèi)容 是一段一段的
                Object[] pdus = (Object[]) bundle.get("pdus");

                //短信對象數(shù)組
                SmsMessage[] messages = new SmsMessage[pdus.length];
                for (int i = 0; i < pdus.length; i++) {
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                }

                //循環(huán)遍歷短信數(shù)組 取出內(nèi)容
                for (int i = 0; i < messages.length; i++) {

                    if (i == 0) {
                        sb.append("發(fā)件人:" + messages[i].getDisplayOriginatingAddress()
                                + "\n信息內(nèi)容為:\n");
                    }
                    sb.append(messages[i].getDisplayMessageBody() + "\n");
                }

                Log.e("---sss---", sb.toString());

            }

        }

    }
}

2.清單文件里注冊

<receiver android:name=".receiver.MessageReceiver">
     <intent-filter android:priority="1000">
          <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
     </intent-filter>
</receiver>

3.添加接收短信的權(quán)限

<uses-permission android:name="android.permission.RECEIVE_SMS"/>

最后可以看到輸出結(jié)果如下:

讀取短信內(nèi)容

四晾虑、BroadcastReceiver總結(jié)

下面是對BroadcastReceiver的小結(jié)疹味。

1.廣播的兩種注冊方式

廣播Broadcast的注冊方式有兩種,一種是在清單文件里靜態(tài)注冊帜篇,還有一種是在代碼里動態(tài)注冊糙捺,那么兩種的區(qū)別是什么呢。 通過在配置文件里面注冊廣播屬于常駐型廣播笙隙,即便應用程序結(jié)束洪灯,一旦有了對應的廣播過來,其還是會被激活竟痰;而在代碼里注冊的廣播則是非常駐型廣播签钩,比如在oncreate方法里面注冊一個廣播,那么在ondestroy里就可以BroadcastReceiver.abortBroadcast()坏快。對于第一種方法铅檩,我們需要養(yǎng)成一個良好的習慣:在Activity進入停止或者銷毀狀態(tài)的時候使用unregisterReceiver方法將注冊的BroadcastReceiver注銷掉。如果在清單文件里靜態(tài)注冊莽鸿,那么該對象的實例在onReceive被調(diào)用之后就會在任意時間內(nèi)被銷毀昧旨。也就是說,我們并需要擔心靜態(tài)注冊的BroadcastReceiver的銷毀問題祥得。

2.廣播的兩種類型

廣播Broadcast有兩種類型兔沃,我們通過方法sendBroadcast()發(fā)送的是無序廣播,它是完全異步的级及,可以同時被所有接收者接收到乒疏,消息傳遞效率高,但是接收者不能把處理結(jié)果傳遞給下一個接收者创千,且不能終止廣播的繼續(xù)傳播缰雇。通過sendOrderedBroadcast()發(fā)送的是有序廣播,系統(tǒng)會根據(jù)接收器聲明的優(yōu)先級別按順序逐個接收追驴,先接收廣播的可以使用abortBroadcast()方法終止Broadcast的繼續(xù)傳播械哟,此外,先接收到廣播的還可以通過方法setResultExtras來存數(shù)據(jù)到廣播中殿雪,下一個接收到的可以獲取存入的數(shù)據(jù)暇咆。

3.其它注意點

在新建自己的廣播接收器時,我們要實現(xiàn)onReceive()方法,在里面完成自己的邏輯爸业,這里不能做耗時的操作其骄,建議是10s以內(nèi)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扯旷,一起剝皮案震驚了整個濱河市拯爽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件份殿,死亡現(xiàn)場離奇詭異,居然都是意外死亡桃煎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門大刊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來为迈,“玉大人,你說我怎么就攤上這事缺菌『” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵伴郁,是天一觀的道長另患。 經(jīng)常有香客問我,道長蛾绎,這世上最難降的妖魔是什么昆箕? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮租冠,結(jié)果婚禮上鹏倘,老公的妹妹穿的比我還像新娘。我一直安慰自己顽爹,他們只是感情好纤泵,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著镜粤,像睡著了一般捏题。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肉渴,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天公荧,我揣著相機與錄音,去河邊找鬼同规。 笑死循狰,一個胖子當著我的面吹牛窟社,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绪钥,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼灿里,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了程腹?” 一聲冷哼從身側(cè)響起匣吊,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寸潦,沒想到半個月后缀去,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡甸祭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了褥影。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片池户。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凡怎,靈堂內(nèi)的尸體忽然破棺而出校焦,到底是詐尸還是另有隱情,我是刑警寧澤统倒,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布寨典,位于F島的核電站,受9級特大地震影響房匆,放射性物質(zhì)發(fā)生泄漏耸成。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一浴鸿、第九天 我趴在偏房一處隱蔽的房頂上張望井氢。 院中可真熱鬧,春花似錦岳链、人聲如沸花竞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽约急。三九已至,卻和暖如春苗分,著一層夾襖步出監(jiān)牢的瞬間厌蔽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工摔癣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留躺枕,地道東北人服猪。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像拐云,于是被迫代替她去往敵國和親罢猪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

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