四大組件的區別
- 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就相當於:定義的人能說話,但是作爲人的子類的學生不能說話,這樣是不和邏輯的。