參考博客:
http://blog.csdn.net/t12x3456/article/details/9256609
http://blog.csdn.net/lihenair/article/details/19343767
http://blog.csdn.net/plussoft/article/details/12971265
http://blog.csdn.net/xyz_fly/article/details/18970569
在Android系統中,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"屬性表示接收者對外部應用程序不可用,即不接受來自外部的廣播。
上面兩個問題其實都可以通過LocalBroadcastManager來解決:
Android v4 兼容包提供android.support.v4.content.LocalBroadcastManager工具類,幫助大家在自己的進程內進行局部廣播發送與注冊,使用它比直接通過sendBroadcast(Intent)發送系統全局廣播有以下幾點好處。
1 因廣播數據在本應用范圍內傳播,你不用擔心隱私數據泄露的問題。
2 不用擔心別的應用偽造廣播,造成安全隱患。
3 相比在系統內發送全局廣播,它更高效。
其使用方法也和正常注冊廣播類似:
//在application中使用 public static void sendLocalBroadcast(Intent intent) { LocalBroadcastManager.getInstance(getInstance()).sendBroadcastSync(intent); } public static void registerLocalReceiver(BroadcastReceiver receiver, IntentFilter filter) { LocalBroadcastManager.getInstance(getInstance()).registerReceiver(receiver, filter); } public static void unregisterLocalReceiver(BroadcastReceiver receiver) { LocalBroadcastManager.getInstance(getInstance()).unregisterReceiver(receiver); }
小結:
1、LocalBroadcastManager在創建單例傳參時,不用糾結context是取activity的還是Application的,它自己會取到tApplicationContext。
2、LocalBroadcastManager只適用於代碼間的,因為它就是保存接口BroadcastReceiver的對象,然后直接調用其onReceive方法。
3、LocalBroadcastManager注冊廣播后,當該其Activity或者Fragment不需要監聽時,記得要取消注冊,注意一點:注冊與取消注冊在activity或者fragment的生命周期中要保持一致,例如onResume,onPause。
4、LocalBroadcastManager雖然 支持對同一個BroadcastReceiver可以注冊多個IntentFilter,但還是應該將所需要的action都放進一個 IntentFilter,即只注冊一個IntentFilter,這只是我個人的建議。
5、LocalBroadcastManager所發 送的廣播action,只能與注冊到LocalBroadcastManager中BroadcastReceiver產生互動。如果你遇到了通過 LocalBroadcastManager發送的廣播,對面的BroadcastReceiver沒響應,很可能就是這個原因造成的。