1. 程式人生 > >"BroadcastReceiver"-安卓面試必問技能點大總結"

"BroadcastReceiver"-安卓面試必問技能點大總結"

大家好,現在我們開始講解四大元件之三-廣播接收者,一下是技能點大總結,讓我們詳細的去了解吧.

廣播接收者:

1.請描述一下BroadcastReceiver

  • 1.是四大元件之一,主要用於接收app傳送的廣播
  • 2.內部通訊實現機制:通過android系統的Binder機制.
  • 3.廣播分為兩種:

    • 無序廣播
      • 優點:完全非同步,邏輯上可被任何接受者收到廣播,效率高
      • 缺點:接受者不能講處理結果交給下一個接受者,且無法終止廣播.
    • 有序廣播
      • 按被接收者的優先順序循序傳播
      • A>B>C,每個都有權終止廣播,下一個就得不到
      • 每一個都可進行修改操作,下一個就得到上一個修改後的結果.
  • 4.最終廣播者:

    • Context.sendOrderedBroadcast(intent,receiverPermission,resultReceiver,scheduler,initialCode,initialData,initialExtras)時我們可以指定resultReceiver為最終廣播接收者.
    • 如果比他優先順序高的接受者不終止廣播,那麼他的onReceive會執行兩次
      • 第一次是正常的接收
      • 第二次是最終的接收
    • 如果優先順序高的那個終止廣播,那麼還是依然收到一次最終的廣播
  • 5.常見的廣播接收者運用場景:

    • 開機啟動,sd卡掛載,低電量,外撥電話,鎖屏等
    • 比如根據產品經理要求,設計播放音樂時,鎖屏是否決定暫停音樂.

2.在mainfest和程式碼如何註冊和使用BroadcastReceiver?-一個action是重點

  • 1.情況檔案註冊(靜態廣播)

    • 只要app還在執行,那麼會一直收到廣播訊息
    • 演示:

      • 1.一個app裡:自定義一個類繼承BroadcastReceiver然後要求重寫onReveiver方法

        public class MyBroadCastReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.d("MyBroadCastReceiver", "收到資訊,內容是 : " + intent.getStringExtra("info") + "");
            }
        }
        
      • 2.清單檔案註冊,並設定Action,就那麼簡單完成接收準備工作

        <receiver android:name=".MyBroadCastReceiver">
            <intent-filter>
                <action android:name="myBroadcast.action.call"/>
            </intent-filter>
        </receiver>
        
  • 2.程式碼註冊(動態廣播)

    • 當註冊的Activity或者Service銷燬了那麼就會接收不到廣播.
    • 演示:

      • 1.在和廣播接受者相同的app裡的MainActivity新增一個註冊按鈕,用來註冊廣播接收者
      • 2.設定意圖過濾,新增Action

        //onCreate建立廣播接收者物件
        mReceiver = new MyBroadCastReceiver();              
        
        //註冊按鈕
        public void click(View view) {
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction("myBroadcast.action.call");
            registerReceiver(mReceiver, intentFilter);
        }
        
      • 3.銷燬的時候取消註冊

        @Override
        protected void onDestroy() {
            unregisterReceiver(mReceiver);
            super.onDestroy();
        }
        
  • 3.在另一個app,定義一個按鈕,設定意圖,意圖新增訊息內容,意圖設定action()要匹配,然後傳送廣播即可.

    public void click(View view) {
        Intent intent = new Intent();
        intent.putExtra("info", "訊息內容");
        intent.setAction("myBroadcast.action.call");
        sendBroadcast(intent);
    }
    
  • 兩個app都執行之後:靜

    • 靜態註冊的方法:另一app直接發廣播就收到了
    • 動態註冊的方法:自己的app先程式碼註冊,然後另一個app直接發廣播即可.

3.BroadCastReceiver的生命週期

  • a.只有一個onReceiver, 相當的短暫,方法完成後廣播接受者 就銷燬,傳送一次呼叫一次
  • b.接受者不要做耗時操作,否則出現ANR
  • c.也不要開啟子執行緒進行耗時操作,因為生命週期結束後 整個程序就變程序了,容易被系統殺掉
  • d.耗時較長的工作最好放在服務裡.

4.如何讓自己的廣播只讓指定的app接收?

在傳送廣播的app端,自定義定義許可權,那麼想要接收的另外app端必須宣告許可權才能收到.

  • 1.許可權,保護層級是普通正常.
  • 2.使用者許可權
<permission android:name="broad.ok.receiver" android:protectionLevel="normal"/>
<uses-permission android:name="broad.ok.receiver" />
  • 3.傳送廣播的時候加上許可權字串
public void click(View view) {
    Intent intent = new Intent();
    intent.putExtra("info", "訊息內容");
    intent.setAction("myBroadcast.action.call");
    sendBroadcast(intent, "broad.ok.receiver");
    //sendOrderedBroadcast(intent,"broad.ok.receiver");
}

其他app接收者想好獲取廣播,必須宣告在清單檔案許可權

<uses-permission android:name="broad.ok.receiver"/>

5.什麼是最終廣播接收者

(針對有序廣播來說)

  • Context.sendOrderedBroadcast(intent,receiverPermission,resultReceiver,scheduler,initialCode,initialData,initialExtras)時我們可以指定resultReceiver為最終廣播接收者.
  • 最終接受者可能會接收到兩次:第一次:按照標準的優先順序接收,第二次,作為final receiver肯定會收到.

6.廣播的優先順序對無序廣播生效嗎?

  • 優先順序對無序也生效.

7.動態註冊的廣播優先順序誰高?

  • 誰先註冊,誰就高

8.如何判斷當前的BrodcastReceiver接收到的是有序還是無序的廣播?

  • 在onReceiver方法裡,直接呼叫判斷方法得返回值
public void onReceive(Context context, Intent intent) {
    Log.d("MyBroadCastReceiver", "收到資訊,內容是 : " + intent.getStringExtra("info") + "");
    boolean isOrderBroadcast = isOrderedBroadcast();
}

9.總結:

  • 人家app傳送廣播,有action;那麼廣播接收者當然要註冊廣播(動/靜),並宣告action才能獲取到廣播
  • 人家發廣播,有action,但是如果人家添加了許可權,那麼你雖然有action,但是如果沒許可權還是收不到,你也要懂許可權字串,並宣告才行.