Android中的廣播Broadcast詳解

1,Broadcast是android中的四大組件之一

2,廣播被分為兩種不同的類型:「普通廣播(Normal broadcasts)」和「有序廣播(Ordered broadcasts)」。普通廣播是完全非同步的,可以在同一時刻(邏輯上)被所有廣播接收者接收到,消息傳遞的效率比較高,但缺點是:接收者不能將處理結果傳遞給下一個接收者,並且無法終止廣播Intent的傳播;然而有序廣播是按照接收者聲明的優先順序別(聲明在intent-filter元素的android:priority屬性中,數越大優先順序別越高,取值範圍:-1000到1000。也可以調用IntentFilter對象的setPriority()進行設置),被接收者依次接收廣播。如:A的級別高於B,B的級別高於C,那麼,廣播先傳給A,再傳給B,最後傳給C。A得到廣播后,可以往廣播里存入數據,當廣播傳給B時,B可以從廣播中得到A存入的數據。

Advertisements

Context.sendBroadcast()

發送的是普通廣播,所有訂閱者都有機會獲得並進行處理。

Context.sendOrderedBroadcast()

發送的是有序廣播,系統會根據接收者聲明的優先順序別按順序逐個執行接收者,前面的接收者有權終止廣播(BroadcastReceiver.abortBroadcast()),如果廣播被前面的接收者終止,後面的接收者就再也無法獲取到廣播。對於有序廣播,前面的接收者可以將處理結果存放進廣播Intent,然後傳給下一個接收者。

3,示例

第一步:定義廣播接收者,繼承BroadcastReceiver,並重寫onReceive()方法。

  1. publicclass IncomingSMSReceiver extendsBroadcastReceiver {

    Advertisements

  2. @Overridepublicvoid onReceive(Contextcontext, Intentintent) {

  3. }

  4. }

第二步:訂閱感興趣的廣播Intent,訂閱方法有兩種:

第一種:使用代碼進行訂閱(動態訂閱)

  1. IntentFilter filter = newIntentFilter("android.provider.Telephony.SMS_RECEIVED");

  2. IncomingSMSReceiver receiver = newIncomingSMSReceiver();

  3. registerReceiver(receiver, filter);

第二種:在AndroidManifest.xml文件中的<application>節點裡進行訂閱(靜態訂閱)

  1. <receiverandroid:name=".IncomingSMSReceiver">

  2. <intent-filter>

  3. <actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>

  4. </intent-filter>

  5. </receiver>

靜態註冊欄位

欄位解釋
android:bannerA Drawable resource providing an extended graphical banner for its associated item. 一個Drawable資源為其相關聯的項目提供擴展的圖形橫幅。
android:descriptionDescriptive text for the associated data. 為關聯數據提供描述。
android:directBootAwareIndicate if this component is aware of direct boot lifecycle, and can be safely run before the user has entered their credentials (such as a lock pattern or PIN). 指示此組件是否知道直接引導生命周期,並且可以在用戶輸入其憑據(例如鎖定模式或PIN)之前安全運行。
android:enabledSpecify whether the receiver is enabled or not (that is, can be instantiated by the system). 指定這個接收者是否被開啟。是否被系統註冊。
android:exportedFlag indicating whether the given application component is available to other applications. 指示給定應用程序組件是否可用於其他應用程序的標誌。
android:iconA Drawable resource providing a graphical representation of its associated item. 一個可繪製的資源,提供其關聯項目的圖形表示。
android:labelA user-legible name for the given item. 給定項目的用戶可讀名稱。
android:logoA Drawable resource providing an extended graphical logo for its associated item. 一個Drawable資源,為其相關聯的項目提供擴展的圖形標誌。
android:nameRequired name of the class implementing the receiver, deriving from BroadcastReceiver. 實現接收器的類的所需名稱,源自BroadcastReceiver。
android:permissionSpecify a permission that a client is required to have in order to use the associated object. 指定客戶機必須具有的許可權才能使用關聯的對象。
android:processSpecify a specific process that the associated code is to run in. 指定一個指定的進程讓關聯的代碼在此上運行。
android:roundIconA Drawable resource providing a graphical representation of its associated item. 一個可繪製的資源,提供其關聯項目的圖形表示。
android:singleUserIf set to true, a single instance of this component will run for all users. 如果設置為true,則此組件的單個實例將為所有用戶運行。

動態廣播訂閱和靜態廣播訂閱的區別:

靜態訂閱廣播又叫:常駐型廣播,當你的應用程序關閉了,如果有廣播信息來,你寫的廣播接收器同樣的能接受到,他的註冊方式就是在你的應用程序中的AndroidManifast.xml進行訂閱的。

動態訂閱廣播又叫:非常駐型廣播,當應用程序結束了,廣播自然就沒有了,比如你在activity中的onCreate或者onResume中訂閱廣播,同時你必須在onDestory或者onPause中取消廣播訂閱。不然會報異常,這樣你的廣播接收器就一個非常駐型的了。

這裡面還有一個細節那就是這兩種訂閱方式,在發送廣播的時候需要注意的是:動態註冊的時候使用的是隱式intent方式的,所以在發送廣播的時候需要使用隱式Intent去發送,不然是廣播接收者是接收不到廣播的,這一點要注意。但是靜態訂閱的時候,因為在AndroidMainfest.xml中訂閱的,所以在發送廣播的時候使用顯示Intent和隱式Intent都可以(當然這個只針對於我們自己定義的廣播接收者),所以以防萬一,我們一般都採用隱式Intent去發送廣播。

4,系統常用廣播

//關閉或打開飛行模式時的廣播

Intent.ACTION_AIRPLANE_M;

//充電狀態,或者電池的電量發生變化;//電池的充電狀態、電荷級別改變,不能通過組建聲;

Intent.ACTION_BATTERY_CH;

//表示電池電量低

Intent.ACTION_BATTERY_LO;

//表示電池電量充足

Intent.ACTION_BATTERY_OK;

//關閉或打開飛行模式時的廣播

Intent.ACTION_AIRPLANE_MODE_CHANGED;

//充電狀態,或者電池的電量發生變化//電池的充電狀態、電荷級別改變,不能通過組建聲明接收這個廣播,只有通過Context.registerReceiver()註冊

Intent.ACTION_BATTERY_CHANGED;

//表示電池電量低

Intent.ACTION_BATTERY_LOW;

//表示電池電量充足,即從電池電量低變化到飽滿時會發出廣播

Intent.ACTION_BATTERY_OKAY;

//在系統啟動完成後,這個動作被廣播一次(只有一次)。

Intent.ACTION_BOOT_COMPLETED;

//按下照相時的拍照按鍵(硬體按鍵)時發出的廣播

Intent.ACTION_CAMERA_BUTTON;

//當屏幕超時進行鎖屏時,當用戶按下電源按鈕,長按或短按(不管有沒跳出話框),進行鎖屏時,android系統都會廣播此Action消息

Intent.ACTION_CLOSE_SYSTEM_DIALOGS;

//設備當前設置被改變時發出的廣播(包括的改變:界面語言,設備方向,等,請參考Configuration.java)

Intent.ACTION_CONFIGURATION_CHANGED;

//設備日期發生改變時會發出此廣播

Intent.ACTION_DATE_CHANGED;

//設備內存不足時發出的廣播,此廣播只能由系統使用,其它APP不可用

Intent.ACTION_DEVICE_STORAGE_LOW;

//設備內存從不足到充足時發出的廣播,此廣播只能由系統使用,其它APP不可用

Intent.ACTION_DEVICE_STORAGE_OK;

//發出此廣播的地方frameworks\base\services\java\com\android\server\DockObserver.java

Intent.ACTION_DOCK_EVENT;

//移動APP完成之後,發出的廣播(移動是指:APP2SD)

Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE;

//正在移動APP時,發出的廣播(移動是指:APP2SD)

Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;

//Gtalk已建立連接時發出的廣播

Intent.ACTION_GTALK_SERVICE_CONNECTED;

//Gtalk已斷開連接時發出的廣播

Intent.ACTION_GTALK_SERVICE_DISCONNECTED;

//在耳機口上插入耳機時發出的廣播

Intent.ACTION_HEADSET_PLUG;

//改變輸入法時發出的廣播

Intent.ACTION_INPUT_METHOD_CHANGED;

//設備當前區域設置已更改時發出的廣播

Intent.ACTION_LOCALE_CHANGED;

//表示用戶和包管理所承認的低內存狀態通知應該開始。

Intent.ACTION_MANAGE_PACKAGE_STORAGE;

//未正確移除SD卡(正確移除SD卡的方法:設置--SD卡和設備內存--卸載SD卡),但已把SD卡取出來時發出的廣播 ,擴展介質(擴展卡)已經從 SD 卡插槽拔出,但是掛載點 (mount point) 還沒解除 (unmount)

Intent.ACTION_MEDIA_BAD_REMOVAL;

//按下"Media Button" 按鍵時發出的廣播,假如有"Media Button" 按鍵的話(硬體按鍵)

Intent.ACTION_MEDIA_BUTTON;

//插入外部儲存裝置,比如SD卡時,系統會檢驗SD卡,此時發出的廣播?

Intent.ACTION_MEDIA_CHECKING;

//已拔掉外部大容量儲存設備發出的廣播(比如SD卡,或移動硬碟),不管有沒有正確卸載都會發出此廣播, 用戶想要移除擴展介質(拔掉擴展卡)。

Intent.ACTION_MEDIA_EJECT;

//插入SD卡並且已正確安裝(識別)時發出的廣播, 擴展介質被插入,而且已經被掛載。

Intent.ACTION_MEDIA_MOUNTED;

//拓展介質存在,但使用不兼容FS(或為空)的路徑安裝點檢查介質包含在Intent.mData領域。

Intent.ACTION_MEDIA_NOFS;

//外部儲存設備已被移除,不管有沒正確卸載,都會發出此廣播, 擴展介質被移除。

Intent.ACTION_MEDIA_REMOVED;

//廣播:已經掃描完介質的一個目錄

Intent.ACTION_MEDIA_SCANNER_FINISHED;

//請求媒體掃描儀掃描文件並將其添加到媒體資料庫。

Intent.ACTION_MEDIA_SCANNER_SCAN_FILE;

//廣播:開始掃描介質的一個目錄

Intent.ACTION_MEDIA_SCANNER_STARTED;

// 廣播:擴展介質的掛載被解除 (unmount),因為它已經作為 USB 大容量存儲被共享。

Intent.ACTION_MEDIA_SHARED;

Intent.ACTION_MEDIA_UNMOUNTABLE;//

// 廣播:擴展介質存在,但是還沒有被掛載 (mount)

Intent.ACTION_MEDIA_UNMOUNTED

Intent.ACTION_NEW_OUTGOING_CALL;

//成功的安裝APK之後//廣播:設備上新安裝了一個應用程序包。//一個新應用包已經安裝在設備上,數據包括包名(最新安裝的包程序不能接收到這個廣播)

Intent.ACTION_PACKAGE_ADDED;

//一個已存在的應用程序包已經改變,包括包名

Intent.ACTION_PACKAGE_CHANGED;

//清除一個應用程序的數據時發出的廣播(在設置--應用管理--選中某個應用,之後點清除數據時?)//用戶已經清除一個包的數據,包括包名(清除包程序不能接收到這個廣播)

Intent.ACTION_PACKAGE_DATA_CLEARED;

//觸發一個下載並且完成安裝時發出的廣播,比如在電子市場里下載應用?

Intent.ACTION_PACKAGE_INSTALL;

//成功的刪除某個APK之後發出的廣播, 一個已存在的應用程序包已經從設備上移除,包括包名(正在被安裝的包程序不能接收到這個廣播)

Intent.ACTION_PACKAGE_REMOVED;

//替換一個現有的安裝包時發出的廣播(不管現在安裝的APP比之前的新還是舊,都會發出此廣播?)

Intent.ACTION_PACKAGE_REPLACED;

//用戶重新開始一個包,包的所有進程將被殺死,所有與其聯繫的運行時間狀態應該被移除,包括包名(重新開始包程序不能接收到這個廣播)

Intent.ACTION_PACKAGE_RESTARTED;

//插上外部電源時發出的廣播

Intent.ACTION_POWER_CONNECTED;

//已斷開外部電源連接時發出的廣播

Intent.ACTION_POWER_DISCONNECTED;

Intent.ACTION_PROVIDER_CHANGED;//

//重啟設備時的廣播

Intent.ACTION_REBOOT;

//屏幕被關閉之後的廣播

Intent.ACTION_SCREEN_OFF;

//屏幕被打開之後的廣播

Intent.ACTION_SCREEN_ON;

//關閉系統時發出的廣播

Intent.ACTION_SHUTDOWN;

//時區發生改變時發出的廣播

Intent.ACTION_TIMEZONE_CHANGED;

//時間被設置時發出的廣播

Intent.ACTION_TIME_CHANGED;

//廣播:當前時間已經變化(正常的時間流逝), 當前時間改變,每分鐘都發送,不能通過組件聲明來接收

,只有通過Context.registerReceiver()方法來註冊

Intent.ACTION_TIME_TICK;

//一個用戶ID已經從系統中移除發出的廣播

Intent.ACTION_UID_REMOVED;

//設備已進入USB大容量儲存狀態時發出的廣播?

Intent.ACTION_UMS_CONNECTED;

//設備已從USB大容量儲存狀態轉為正常狀態時發出的廣播?

Intent.ACTION_UMS_DISCONNECTED;

Intent.ACTION_USER_PRESENT;//

//設備牆紙已改變時發出的廣播

Intent.ACTION_WALLPAPER_CHANGED;

Advertisements

你可能會喜歡