四大組件-廣播接受者的特別之處

四大組件的區別

  • Activity
  • Service
  • Content provider
  • BroadcastReceiver

廣播接受者很特別:不僅可以在功能功能清單文件當中註冊,還能在代碼中註冊。

在清單文件當中註冊

 <receiver android:name="com.scau.mobilesafe.receiver.OutCallReceiver" >
        <intent-filter >
            <action  android:name="android.intent.action.NEW_OUTGOING_CALL"/>
        </intent-filter>
    </receiver>

在代碼中註冊

private OutCallReceiver receiver;

//註冊監聽去電
    receiver= new OutCallReceiver();
    IntentFilter filter =new IntentFilter();
    filter.addAction("android.intent.action.NEW_OUTGOING_CALL");//監聽去電的動作
    registerReceiver(receiver, filter);
  • 對比以上兩種註冊方法
    • 在清單文件當中註冊,不論程序是否開啓,這個註冊信息同樣都會生效,所以在某些場合,當程序關閉後註冊的清單文件也要隨着失效的情況下,選擇用代碼註冊會比較科學。
    • 用代碼註冊的一下幾大要點:
      • 在將要註冊的信息定義成類的成員變量,這很關鍵。因爲後面要將這個文件註銷的時候,用到就是這個成員變量。
      • 在具體註冊監聽過程中,現定義好的信息new(創建出來),然跟在清單文件當中註冊是一樣的流程。將一路意圖過濾器創建出來之後,添加意圖過濾器的反應。這個反應就是來電監聽,這時候還是要用到系統給定的NEW_OUTGOING_CALL監聽接口。
      • 最後在onCreate方法中將這個方法註冊一下。

父類和子類的權限問題

private class OutCallReceiver extends BroadcastReceiver {

    private void onReceive(Context context, Intent intent) {
        String number = getResultData();
        String address = NumberAddressQureyDao.getAddress(number);
        Toast.makeText(context, address, 1).show();
    }
}

會報如下錯誤

    Cannot reduce the visibility of the inherited method from BroadcastReceiver
  • 意思是子類的權限不能覆蓋父類的權限。
    • 因爲廣播接受者(BroadcastReceiver)在源碼中給定的權限是public。所以如果此處使用private就相當於:定義的人能說話,但是作爲人的子類的學生不能說話,這樣是不和邏輯的。
發佈了45 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章