BroadcastReceiver

1.BroadcastReceiver機制

Android廣播分爲兩個方面:廣播發送者和廣播接收者,通常情況下,BroadcastReceiver指的就是廣播接收者(廣播接收器)。

廣播作爲Android組件間的通信方式,可以使用的場景如下:
1.同一app內部的同一組件內的消息通信(單個或多個線程之間);
2.同一app內部的不同組件之間的消息通信(單個進程);
3.同一app具有多個進程的不同組件之間的消息通信;
4.不同app之間的組件之間消息通信;
5.Android系統在特定情況下與App之間的消息通信。

2.BroadcastReceiver類型

標準廣播和有序廣播

標準廣播,廣播發出後,所有廣播接收器幾乎同時收到廣播,幾乎沒有任何先後順序而言。因此它也不能被截斷。

sendBroadcast(intent);

有序廣播,廣播發出後,只有一個廣播接收器收到該廣播。當這個廣播接收器的邏輯執行完畢之後,再向下傳遞。所以此時的廣播接收器是有優先級順序的。

 sendOrderedBroadcast(intent, null);  

參數2,是一個權限,可爲null,也可以自己做一個權限。

3.BroadcastReceiver的生命週期:

BroadcastReceiver的生命週期,從對象調用它開始,到onReceiver方法執行完成之後結束。另外,每次廣播被接收後會重新創建BroadcastReceiver對象,並在onReceiver方法中執行完就銷燬,如果BroadcastReceiver的onReceiver方法中不能在10秒內執行完成,Android會出現ANR異常。所以不要在BroadcastReceiver的onReceiver方法中執行耗時的操作。

如果需要在BroadcastReceiver中執行耗時的操作,可以通過Intent啓動Service來完成。但不能綁定Service。

特別是,您可能無法從一個BroadcastReceiver中顯示一個對話框,或綁定到服務。對於前者,則應該使用NotificationManager的API。對於後者,你可以使用Context.startService()來啓動一個Service。

4.BroadcastReceiver兩種註冊方式
靜態註冊,標準廣播,接收器用action來辨別接收的廣播。

<receiver 
    android:name=".MyReceiver">  
    <intent-filter>  
        <action android:name="android.intent.action.MY_BROADCAST"/>  
    </intent-filter>  
</receiver> 

靜態註冊 ,有序廣播

 <!--優先級的設定 FirstBroadcastReceiver大於SecondBroadcastReceiver,優先級的範圍-1000~1000 -->  
<receiver android:name=".FirstBroadcastReceiver">
    <intent-filter android:priority="200">
        <action android:name="android.intent.action.OrderedBroadcastReceiver"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</receiver>

動態註冊,標準廣播

MyBroadcastReceiver receiver=new MyBroadcastReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");

registerReceiver(myBroadcastReceiver, filter);

動態註冊,有序廣播

FirstBroadCast firstBroadCast=new FirstBroadCast();
IntentFilter filter1 = new IntentFilter();  
filter1.addAction(MY_BROADCAST_ACTION);  
filter1.setPriority(1000);  

registerReceiver(firstBroadCast, filter1);  

5.BroadcastReceiver應用實例:

6.Local Broadcast:App應用內廣播(此處的App應用以App應用進程爲界)

Android中的廣播可以跨進程甚至跨App直接通信,且註冊是exported對於有intent-filter的情況下默認值是true,由此將可能出現安全隱患如下:

1.其他App可能會針對性的發出與當前App intent-filter相匹配的廣播,由此導致當前App不斷接收到廣播並處理;

2.其他App可以註冊與當前App一致的intent-filter用於接收廣播,獲取廣播具體信息。

無論哪種情形,這些安全隱患都確實是存在的。由此,最常見的增加安全性的方案是:

1.對於同一App內部發送和接收廣播,將exported屬性人爲設置成false,使得非本App內部發出的此廣播不被接收;
2.在廣播發送和接收時,都增加上相應的permission,用於權限驗證;
3.發送廣播時,指定特定廣播接收器所在的包名,具體是通過intent.setPackage(packageName)指定在,這樣此廣播將只會發送到此包中的App內與之相匹配的有效廣播接收器中。
App應用內廣播可以理解成一種局部廣播的形式,廣播的發送者和接收者都同屬於一個App。實際的業務需求中,App應用內廣播確實可能需要用到。同時,之所以使用應用內廣播時,而不是使用全局廣播的形式,更多的考慮到的是Android廣播機制中的安全性問題。
相比於全局廣播,App應用內廣播優勢體現在:
1.安全性更高;
2.更加高效。
爲此,Android v4兼容包中給出了封裝好的LocalBroadcastManager類,用於統一處理App應用內的廣播問題,使用方式上與通常的全局廣播幾乎相同,只是註冊/取消註冊廣播接收器和發送廣播時將主調context變成了LocalBroadcastManager的單一實例。

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