BrodcastReceiver面試知識小結

本博客是對BrodcastReceiver基本面試知識的一個小結,該博客複製參考了Hensen_,感謝原文博主的分享,在前人的基礎上做了補充,方便後期知識的回顧。

推薦博文:Android四大組件:BroadcastReceiver史上最全面解析

1、Broadcast Receiver是什麼?

Broadcast是四大組件之一,是一種廣泛運用在應用程序之間傳輸信息的機制,通過發送Intent來傳送我們的數據。

2、Broadcast Receiver的使用場景

  • 同一App具有多個進程的不同組件之間的消息通信.
  • 不同App之間的組件之間的消息通信.

3、Broadcast Receiver的種類

  • 普通廣播 (Normal Broadcast): 開發者自身定義intent的廣播(最常用)。

  • 系統廣播 (System Broadcast): Android中內置了多個系統廣播:只要涉及到手機的基本操作(如開機、網絡狀態變化、拍照等等),都會發出相應的廣播。

  • 有序廣播 (Ordered Broadcast): 發送出去的廣播被廣播接收者按照先後順序接收,Priority值大的優先接收,值相同先註冊的廣播優先,先接收的廣播可以進行修改、截斷。

  • 本地廣播 (Local Broadcast):App應用內的廣播,廣播的發送者和接收者都同屬於一個App,安全性高 & 效率高。

  • 粘性廣播 (Sticky Broadcast):在Android5.0 & API 21中已經失效。

4、Broadcast Receiver的實現

  • 靜態註冊:註冊後一直運行,儘管Activity、進程、App被殺死還是可以接收到廣播。

  • 動態註冊:跟隨Activity的生命週期變化的。

5、Broadcast Receiver內部實現機制

1.自定義廣播類繼承BroadcastReceiver,複寫onReceiver()。

2.通過Binder機制向AMS(Activity Manager Service)進行註冊廣播.

3.廣播發送者通過Binder機制向AMS發送廣播。

4.AMS查找符合相應條件的廣播發送到BroadcastReceiver(一般情況下是Activity)相應的循環隊列中。

5.消息隊列執行拿到廣播,回調BroadcastReceiver的onReceiver()。

6、LocalBroadcastManager特點

1.本地廣播只能在自身App內傳播,不必擔心泄漏隱私數據。

2.本地廣播不允許其他App對你的App發送該廣播,不必擔心安全漏洞被利用。

3.本地廣播比全局廣播更高效。

4.以上三點都是源於其內部是用Handler實現的,相比系統廣播通過Binder實現更高效,使用Handler實現,別的應用無法向我們應用發送廣播,我們的應用內發送的廣播也不會離開我們的應用。

5.LocalBroadcastManager內部協作主要是靠兩個Map集合:mReceivers和mActions,以及一個List集合mPendingBroadcasts來存儲待接收的廣播對象。

7、代碼實踐

創建MyBroadcastReceiver廣播接收器

public class MyBroadcastReceiver extends BroadcastReceiver {

    // 接收廣播方法,在intent中我們可以取出發送廣播是攜帶的數據.
    @Override
    public void onReceive(Context context, Intent intent) {
        // 接收到廣播,處理需要的邏輯
    }
}

接收系統廣播(監聽網絡狀態變化)

(1).靜態註冊:

       <!--靜態註冊廣播在Manifests註冊-->
        <receiver android:name=".receiver.MyBroadcastReceiver">
            <!--用於指定此廣播接收器將接收的廣播類型-->
            <!--本示例中給出的是用於接收網絡狀態改變時發出的廣播-->
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>

(2).動態註冊:

package com.example.ling.myreview.receiver;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.example.ling.myreview.R;

public class BroadcastReceiverActivity extends AppCompatActivity {
    private MyBroadcastReceiver mBroadcastReceiver = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broadcast_receiver);
        // 創建廣播接收器
        mBroadcastReceiver = new MyBroadcastReceiver();
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 註冊廣播接收器
        //設置廣播接收器將接收的廣播類型
        //用於接收網絡狀態改變時發出的廣播
        final String action = "android.net.conn.CONNECTIVITY_CHANGE";
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(action);
        registerReceiver(mBroadcastReceiver, intentFilter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 解除註冊廣播接收器
        unregisterReceiver(mBroadcastReceiver);
    }
}

發送普通廣播

(1). 發送廣播:

  Intent intent = new Intent();
        //對應BroadcastReceiver中intentFilter的action
        intent.setAction("YOU_BROADCAST_RECEIVER_ACTION");
        //可以在intent中傳遞數據。
        //發送廣播
        sendBroadcast(intent);

(2). 註冊監聽廣播:

        final String action = "YOU_BROADCAST_RECEIVER_ACTION";
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(action);
        registerReceiver(mBroadcastReceiver, intentFilter);

(3). 解除監聽廣播:

        unregisterReceiver(mBroadcastReceiver);

發送有序廣播

// 發送有序廣播
sendOrderedBroadcast(intent, null);
// 註冊監聽廣播、解除監聽廣播代碼類似省略。

本地廣播

//步驟1:實例化BroadcastReceiver子類 & IntentFilter 
MyBroadcastReceiver mBroadcastReceiver = new MyBroadcastReceiver(); 
IntentFilter intentFilter = new IntentFilter(); 

//步驟2:實例化LocalBroadcastManager的實例
localBroadcastManager = LocalBroadcastManager.getInstance(this);

//步驟3:設置接收廣播的類型 
intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);

//步驟4:調用localBroadcastManager的registerReceiver()方法進行動態註冊 
localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);

//取消註冊應用內廣播接收器
localBroadcastManager.unregisterReceiver(mBroadcastReceiver);

//發送應用內廣播
Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
localBroadcastManager.sendBroadcast(intent);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章