Android基礎(chǔ)(5)BroadcastReceiver

1)請(qǐng)描述一下廣播BroadcastReceiver的理解
2)廣播的分類
3)廣播使用的方式和場(chǎng)景
4)在manifest 和代碼中如何注冊(cè)和使用BroadcastReceiver?
5)本地廣播和全局廣播有什么差別?(應(yīng)用內(nèi)和應(yīng)用外)
6)如何通過廣播攔截和abort一條短信?
7)廣播是否可以請(qǐng)求網(wǎng)絡(luò)?

一.理解:

用于監(jiān)聽(接收)應(yīng)用發(fā)出的廣播消息,并做出響應(yīng)

二. 分類:

普通、系統(tǒng)、有序、本地、粘性廣播。

三. 方式:
  1. 自定義廣播接收者BroadcastReceiver子類,并復(fù)寫onRecvice()方法;
  2. 通過Binder機(jī)制向AMS(Activity Manager Service)進(jìn)行注冊(cè); 分為靜態(tài)和動(dòng)態(tài)。
  3. 廣播發(fā)送者通過Binder機(jī)制向AMS發(fā)送廣播;
  4. AMS查找符合相應(yīng)條件(IntentFilter/Permission等)的BroadcastReceiver,將廣播發(fā)送到
  5. BroadcastReceiver(一般情況下是Activity)相應(yīng)的消息循環(huán)隊(duì)列中;
  6. 消息循環(huán)執(zhí)行拿到此廣播,回調(diào)BroadcastReceiver中的onReceive()方法。

場(chǎng)景:

四. 動(dòng)態(tài)與靜態(tài)
@Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

    //實(shí)例化BroadcastReceiver子類 &  IntentFilter
     mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
     IntentFilter intentFilter = new IntentFilter();

    //設(shè)置接收廣播的類型
     intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);

    //調(diào)用Context的registerReceiver()方法進(jìn)行動(dòng)態(tài)注冊(cè)
     registerReceiver(mBroadcastReceiver, intentFilter);
 }
<receiver 
    //此廣播接收者類是mBroadcastReceiver
    android:name=".mBroadcastReceiver" >
    //用于接收網(wǎng)絡(luò)狀態(tài)改變時(shí)發(fā)出的廣播
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>
六. 如何通過廣播攔截和abort一條短信?
public class SmsReceiver extends BroadcastReceiver {
        // 當(dāng)接收到短信時(shí)被觸發(fā)
        @Override
        public void onReceive(Context context, Intent intent) {
            // 如果是接收到短信
            if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
                // 取消廣播(這行代碼將會(huì)讓系統(tǒng)收不到短信)
                abortBroadcast();
                StringBuilder sb = new StringBuilder();
                // 接收由SMS傳過來的數(shù)據(jù)
                Bundle bundle = intent.getExtras();
                // 判斷是否有數(shù)據(jù)
                if (bundle != null) {
                    // 通過pdus可以獲得接收到的所有短信消息
                    Object[] pdus = (Object[]) bundle.get("pdus");
                    // 構(gòu)建短信對(duì)象array,并依據(jù)收到的對(duì)象長(zhǎng)度來創(chuàng)建array的大小
                    SmsMessage[] messages = new SmsMessage[pdus.length];
                    for (int i = 0; i < pdus.length; i++) {
                        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                    }
                    // 將送來的短信合并自定義信息于StringBuilder當(dāng)中
                    for (SmsMessage message : messages) {
                        sb.append("短信來源:");
                        // 獲得接收短信的電話號(hào)碼
                        sb.append(message.getDisplayOriginatingAddress());
                        sb.append("\n------短信內(nèi)容------\n");
                        // 獲得短信的內(nèi)容
                        sb.append(message.getDisplayMessageBody());
                    }
                }
                Toast.makeText(context, sb.toString(), 5000).show();
            }
        }
    }

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="wuchen.broadcastReceiver"
    android:versionCode="1"
    android:versionName="1.0" >

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name" >

        <receiver android:name=".SmsReceiver" >

            <intent-filter android:priority="800" >

                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
    </application>
    <!-- 授予程序接收短信的權(quán)限 -->

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

</manifest>
七. 廣播中可以打開網(wǎng)絡(luò)?

需要單開子線程否則容易導(dǎo)致ANR 。 Broadcast 10s

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

相關(guān)閱讀更多精彩內(nèi)容

  • 2.1 Activity 2.1.1 Activity的生命周期全面分析 典型情況下的生命周期:在用戶參與的情況下...
    AndroidMaster閱讀 3,281評(píng)論 0 8
  • 1、動(dòng)態(tài)注冊(cè)過程源碼分析: 在Activity中動(dòng)態(tài)注冊(cè)廣播室,在注冊(cè)方法之前其實(shí)省略了Context,也就是實(shí)際...
    騎著豬的蝸牛閱讀 856評(píng)論 0 1
  • 最近剛從舊公司離職,為面試在做準(zhǔn)備,因?yàn)槠綍r(shí)開發(fā)CV大法用得比較多,很多基礎(chǔ)知識(shí)掌握得不是很牢靠以及很多工具框架只...
    黎清海閱讀 2,331評(píng)論 1 19
  • 第一章:Activity生命周期和啟動(dòng)模式 Activity關(guān)閉時(shí)會(huì)調(diào)用onPause()和onStop(),如果...
    loneyzhou閱讀 1,077評(píng)論 0 2
  • 現(xiàn)實(shí)從來不是童話的溫床 不會(huì)徒生希望 但愿未被世俗同化 心底還留有一方凈土 這兩天的淚水就像決堤洪水 來得快去得倒...
    時(shí)光不曾逆流閱讀 176評(píng)論 0 1

友情鏈接更多精彩內(nèi)容