Android面試常客--四大組件之BroadcastReceiver

今天我們要講的主角是四大組件之BroadcastReceiver(廣播),面試官一般都會問到怎麼去註冊廣播啊,這樣註冊廣播會有啥區別的?還有一些廣播的知識點也是需要掌握的。

Q:BroadcastReceiver的生命週期
A:其實它只有一個onReceiver,不過面試官想考察的並不是它的生命週期,而是你對廣播是否真正掌握,下面一併講解下。
1、只有一個onReceiver, 相當的短暫,方法完成後廣播接受者 就銷燬,發送一次調用一次。
2、接受者不要做耗時操作,否則出現ANR。
3、也不要開啓子線程進行耗時操作,因爲生命週期結束後 整個進程就變進程了,容易被系統殺掉。
4、耗時較長的工作最好放在服務裏。

Q:BroadCastReceiver的註冊方式有哪些?異同點?
A:
註冊方式:
一種是在代碼當中註冊,註冊的方法是registerReceiver(receiver,filter)(用Activity的實例來調用),取消註冊的方法:unregisterReceiver(receiver),如果一個BroadcastReceiver用於更新UI(User Interface),那麼通常會使用這種方法進行註冊,在Activity啓動的時候進行註冊,在Activity不可見後取消註冊;另一種就是在 AndroidManifest當中進行註冊。
異同:
在AndroidManifest中進行註冊後,不管改應用程序是否處於活動狀態,都會進行監聽,比如某個程序時監聽內存的使用情況的,當在手機上安裝好後,不管改應用程序是處於什麼狀態,都會執行改監聽方法中的內容。
在代碼中進行註冊後,當應用程序關閉後,就不再進行監聽。我們讀知道,應用程序是否省電,決定了該應用程序的受歡迎程度,所以,對於那些沒必要在程序關閉後仍然進行監聽的Receiver。

Q:動態註冊的廣播優先級誰高?
A:誰先註冊,誰就高

Q:BroadcastReceiver的安全性問題
A:BroadcastReceiver的設計初衷就是從全局考慮的,可以方便應用程序和系統、應用程序之間、應用程序內的通信,所以對單個應用程序而言BroadcastReceiver是存在安全性問題的,相應問題及解決如下:
1、當應用程序發送某個廣播時系統會將發送的Intent與系統中所有註冊的BroadcastReceiver的IntentFilter進行匹配,若匹配成功則執行相應的onReceive函數。可以通過類似sendBroadcast(Intent, String)的接口在發送廣播時指定接收者必須具備的permission。或通過Intent.setPackage設置廣播僅對某個程序有效。
2、當應用程序註冊了某個廣播時,即便設置了IntentFilter還是會接收到來自其他應用程序的廣播進行匹配判斷。對於動態註冊的廣播可以通過類似registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)的接口指定發送者必須具備的permission,對於靜態註冊的廣播可以通過android:exported=”false”屬性表示接收者對外部應用程序不可用,即不接受來自外部的廣播。
3、上面兩個問題其實都可以通過LocalBroadcastManager來解決。
4、使用android:protectionLevel

Q:BroadcastReceiver的分類
A:BroadcastReceiver可以分爲普通和有序兩種。
通過Context.sendBroadcast發送的廣播即爲普通廣播,對於普通廣播接收者接收到它的順序是不定的,所以接收者接收到後無法使用其他接收者對它的處理結果也無法停止它。
通過Context.sendOrderedBroadcast發送的廣播即爲有序廣播,與普通廣播的不同在於,接收者是有序接收到廣播的並且可以對廣播進行修改或是取消廣播向下傳遞。系統根據接收者定義的優先級順序決定哪個接收者先接收到它,接收者處理完後可以將結果傳遞給優先級低的接收者也可以停止廣播使得其他優先級低的接收者無法接收到該廣播。優先級通過android:priority屬性定義,數值越大優先級別越高,取值範圍:-1000到1000,雖然API文檔介紹對sendBroadcast發送的廣播無效,不過本人測試同樣有效,相同優先級的接收者接收到廣播的順序隨機。Android系統收到短信、接到電話後發送的廣播都是有序廣播,所以可以進行短信或電話的攔截,即取消廣播。
PS:有序廣播可以在onReceive函數中通過BroadcastReceiver的abortBroadcast接口(這個接口對sendBroadcast發送廣播無效)取消廣播,通過接口sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle)發送的廣播即便優先級高的廣播取消了廣播,接口參數中指定的BroadcastReceiver依然可以在其他接收者處理完後接收到廣播。通過BroadcastReceiver的getResultExtras接口獲得結果的Bundle再通過Bundle的putString和getString方法修改或獲取數據。

Q:有哪些特殊的BroadcastReceiver?
A:
1、LocalBroadcastManager本地廣播
android引入了LocalBroadcastManager解決安全性介紹的一些問題,LocalBroadcastManager除了能解決BroadcastReceiver進程間安全性問題外,相對Context操作的BroadcastReceiver而言還具有更高的運行效率。
使用LocalBroadcastManager需要引入Android Support Library,如何引入見Add Support Package。
本地廣播通過LocalBroadcastManager.getInstance(context).sendBroadcast(intent)發送廣播,LocalBroadcastManager.getInstance(context).registerReceiver註冊服務,通過LocalBroadcastManager.getInstance(context).unregisterReceiver取消註冊服務,其他同普通廣播.
2、Sticky Broadcast粘性廣播
如果發送者發送了某個廣播,而接收者在這個廣播發送後才註冊自己的Receiver,這時接收者便無法接收到剛纔的廣播,爲此Android引入了StickyBroadcast,在廣播發送結束後會保存剛剛發送的廣播(Intent),這樣當接收者註冊完Receiver後就可以繼續使用剛纔的廣播。如果在接收者註冊完成前發送了多條相同Action的粘性廣播,註冊完成後只會收到一條該Action的廣播,並且消息內容是最後一次廣播內容。系統網絡狀態的改變發送的廣播就是粘性廣播。

粘性廣播通過Context的sendStickyBroadcast(Intent)接口發送,需要添加權限
uses-permission android:name=”android.permission.BROADCAST_STICKY”
也可以通過Context的removeStickyBroadcast(Intent intent)接口移除緩存的粘性廣播。
3、OrderedBroadcastReceiver有序廣播
接收者有序接收廣播並可以修改廣播結果或是取消廣播,通過Context的sendOrderedBroadcast接口發送。
4、StickyOrderedBroadcast粘性有序廣播
這個就是粘性廣播和有序廣播的結合了,通過Context的sendStickyOrderedBroadcast接口發送。

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