當Intent發送以後,所有已經註冊的BroadcastReceiver會檢查註冊時的IntentFilter是否與發送的Intent相匹配,若匹配則就會調用BroadcastReceiver的onReceive()方法。所以當我們定義一個BroadcastReceiver的時候,都需要實現onReceive()方法。
2.註冊BroadcastReceiver有兩種方式
靜態註冊:在AndroidManifest.xml中用標籤生命註冊,並在標籤內用標籤設置過濾器
<receiver android:name="ChildReceiver"> //繼承BroadcastReceiver,重寫onReceiver方法
<intent-filter>
<action android:name="zhengnengliang"></action>
</intent-filter>
</receiver>
動態註冊:
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(String); //爲BroadcastReceiver指定action,使之用於接收同action的廣播
registerReceiver(BroadcastReceiver,intentFilter);
其中註冊和取消註冊廣播放在了OnResume和OnPause函數中可以有效的節省系統消耗。如果希望廣播一直運行中可以在Activity的OnCreate函數中註冊,在OnDestrory函數中取消註冊。
3.生命週期
BroadcastReceiver在onReceive函數執行結束後即表示生命週期結束,所以不適合在onReceive中做綁定服務操作,結束後若某個進程只含有該BroadcastReceiver,則優先級將降低可能被系統回收,所以BroadcastReceiver中不適合做一些異步操作,如新建線程下載數據,BroadcastReceiver結束後可能在異步操作完成前進程已經被系統kill。
同時由於ANR限制BroadcastReceiver的onReceive函數必須在10秒內完成,而且onReceive默認會在主線程中執行,所以BroadcastReceiver中不適合做一些耗時操作,對於耗時操作需要交給service處理,比如網絡或數據庫耗時操作、對話框的顯示
4.系統廣播,配置權限
<action android:name="android.intent.action.BOOT_COMPLETED"/>//開機廣播動作
<action android:name="android.intent.action.ACTION_SHUTDOWN"/> //關機廣播動作
來電廣播監聽
實現手機電話狀態的監聽,主要依靠兩個類:TelephoneManger和PhoneStateListener。 TelephonseManger提供了取得手機基本服務的信息的一種方式。因此應用程序可以使用TelephonyManager來探測手機基本服務的情況。應用程序可以註冊listener來監聽電話狀態的改變。我們不能對TelephonyManager進行實例化,只能通過獲取服務的形式:
主要靜態成員常量:(它們對應PhoneStateListener.LISTEN_CALL_STATE所監聽到的內容)
int CALL_STATE_IDLE 空閒狀態,沒有任何活動。
int CALL_STATE_OFFHOOK 摘機狀態,至少有個電話活動。該活動或是撥打(dialing)或是通話,或是 on hold。並且沒有電話是ringing or waiting
int CALL_STATE_RINGING 來電狀態,電話鈴聲響起的那段時間或正在通話又來新電,新來電話不得不等待的那段時間