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

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

一、 BroadcastReceiver是什么
二、 BroadcastReceiver基本用法
三、 BroadcastReceiver例子
四、 BroadcastReceiver總結

一、 BroadcastReceiver是什么

簡單來說,BroadcastReceiver廣播接收器就是一個全局的監(jiān)聽器,它可以監(jiān)聽用戶自己開發(fā)的程序和系統(tǒng)的發(fā)出的廣播消息。具體來說,我們的手機在使用過程中肯定會經歷很多的狀態(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ù),最后調用方法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---", "接收到廣播內容為:" + 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)了起來,這樣廣播接收器就可以接收到通知了。

輸出結果如下:

輸出結果

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

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)我們的需要。

下面展示下怎么獲取手機短信內容。

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();

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

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

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

                //得到信息內容 是一段一段的
                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ù)組 取出內容
                for (int i = 0; i < messages.length; i++) {

                    if (i == 0) {
                        sb.append("發(fā)件人:" + messages[i].getDisplayOriginatingAddress()
                                + "\n信息內容為:\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.添加接收短信的權限

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

最后可以看到輸出結果如下:

讀取短信內容

四、BroadcastReceiver總結

下面是對BroadcastReceiver的小結。

1.廣播的兩種注冊方式

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

2.廣播的兩種類型

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

3.其它注意點

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容