Android中BroadCastReceiver使用

1.在Android中BroadcastReceiver作爲Android四大組件之一,不像Activity,沒有可顯示的界面。BroadcastReceiver包括兩個概念,廣播發送者和廣播接收者(Receiver),這裏的廣播實際就是指Intent,程序可以自己發送廣播自己接收,也可以接受系統或其他應用的廣播或是發送廣播給其他應用程序,BroadcastReceiver是一種廣泛運用的在應用程序之間傳輸信息的機制。而BroadcastReceiver是對發送出來的 Broadcast進行過濾接受並響應的一類組件,接受全局事件的響應,首先在需要發送信息的地方,把要發送的信息和用於過濾的信息(如Action、Category)裝入一個Intent對象,然後通過調用 sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent對象以廣播方式發送出去。

  當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  來電狀態,電話鈴聲響起的那段時間或正在通話又來新電,新來電話不得不等待的那段時間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章