在android系統中sendBroadcast和BroadcastReceiver。只要BroadcastReceiver指定的action和sendBroadcast action一致就可以就行消息接收。但是我們有這樣的需求即我發送的廣播不允許所有應用都可以接收廣播消息,而是要經過發送者允許的纔可以。比如某一個產品簇,每一個產品發送的廣播消息只允許本簇內的產品才允許接收消息。其它應用即使action一樣,也無法接收消息。這樣就大大的提供了產品的安全性。那麼如何實現呢?本文主要目的就是於此。
方法一:只允許本應用內允許接收。
解決方案:LocalBroadcastManager (局部廣播)
優點:
1. 因廣播數據在本應用範圍內傳播,你不用擔心隱私數據泄露的問題。
2. 不用擔心別的應用僞造廣播,造成安全隱患。
3. 相比在系統內發送全局廣播,它更高效。
缺點:
1. 它只能夠在同一個進程使用,如果本應用是多進程的。必須保證發送者和接收者是在同一個進程內
2. 它只能夠動態註冊和取消。
使用實例:
LocalBroadcastManager lbManager = LocalBroadcastManager.getInstance(this);
lbManager.registerReceiver(mReceiver, inFilter);
/**
* 方法一
* 獲得LocalBroadcastManger實例,本應用進程內有效
*/
Intent cintent = new Intent();
cintent.setAction("test");
lbManager.sendBroadcast(cintent);
ps:這個方法要有support-v4.jar包才行
方法二、指定某一個應用允許接收。
解決方案:intent 指定包名Intent.setPackage設置廣播僅對相同包名的有效
優點:
1.支持跨進程
2.receiver可以是靜態註冊也可以是動態註冊。
3.只有指定的包名的應用程序才能夠接收到數據,所以安全性較高。
缺點:
1.如果一旦反編譯,很容易僞造廣播,造成安全隱患
2.在系統內發生全局廣播,它效率較低
3.它只能夠滿足一個應用的需求,不能夠同時指定多個
使用實例:
/**
* 方法二
* 指定包名
*/
Intent mIntent = new Intent();
mIntent.setPackage("com.android.systemUI");
mIntent.setAction("com.method.two");
sendBroadcast(mIntent);
方法三、指定某一個receiver允許接收。
解決方案:intent 指定包名Intent. setComponent設置廣播僅對相同包名的有效
優點:
1.可以指定到具體某一個receiver,安全性更高
2.receiver可以是靜態註冊也可以是動態註冊。
缺點:
1.它只能指定一個receiver,侷限性較大
使用實例:
/**
* 方法三
* 指定receiver
*/
Intent rIntent = new Intent();
mIntent.setComponent(new ComponentName("com.android.systemUI", "com.android.systemUI.MyReceiver"));
mIntent.setAction("com.method.three");
sendBroadcast(rIntent);
方法四、指定多個應用有權接收。
解決方案:sendBroadcast(Intent, String)的接口在發送廣播時指定接收者必須具備的permission。如果擔心反編譯後,權限被竊取,限制失效。可以在聲明權限時,提高權限的
leverl爲簽名驗證,即只有相同簽名的應用且有該權限才能夠接收,這樣就能夠滿足產品簇的問題。
使用實例:
<permission android:description="@string/ttt"
android:label="XXXX"
android:name=" com.method.permission"
android:protectionLevel=" signature"/>
<receiver
android:name="XXXX"
android:permission="com.method.permission" >
<intent-filter>
<action android:name ="*******" />
</intent-filter>
</receiver>
/**
* 方法四
* 指定權限的
*/
Intent fIntent = new Intent();
mIntent.setAction("com.method.whatever");
sendBroadcast(fIntent, "com.method.permission");