在android系統中sendBroadcast和BroadcastReceiver。只要BroadcastReceiver指定的action和sendBroadcast action一致就可以就行消息接收。但是我們有這樣的需求即我發送的廣播不允許所有應用都可以接收廣播消息,而是要經過發送者允許的纔可以。比如某一個產品簇,每一個產品發送的廣播消息只允許本簇內的產品才允許接收消息。其它應用即使action一樣,也無法接收消息。這樣就大大的提供了產品的安全性。那麼如何實現呢?本文主要目的就是於此。
一、只允許本應用內允許接收。
解決方案一:LocalBroadcastManager (局部廣播)
優點:
1.因廣播數據在本應用範圍內傳播,你不用擔心隱私數據泄露的問題。
2. 不用擔心別的應用僞造廣播,造成安全隱患。
3. 相比在系統內發送全局廣播,它更高效。
缺點:
1. 它只能夠在同一個進程使用,如果本應用是多進程的。必須保證發送者和接收者是在同一個進程內。
2. 它只能夠動態註冊和取消。
使用實例:
先通過LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);獲取實例
然後通過函數 registerReceiver來註冊監聽器
registerReceiver(newBroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Handle the received local broadcast
}
}, newIntentFilter(XXXX));
通過 sendBroadcast 函數來發送廣播
lbm.sendBroadcast(newIntent(XXXX));
解決方案二:intent 指定包名Intent.setPackage設置廣播僅對本程序有效【見二】
二、指定某一個應用允許接收。
解決方案:intent 指定包名Intent.setPackage設置廣播僅對相同包名的有效
優點:
1.支持跨進程
2.receiver可以是靜態註冊也可以是動態註冊。
3.只有指定的包名的應用程序才能夠接收到數據,所以安全性較高。
缺點:
1.如果一旦反編譯,很容易僞造廣播,造成安全隱患
2.在系統內發生全局廣播,它效率較低
3.它只能夠滿足一個應用的需求,不能夠同時指定多個
使用實例:
Intent intent = new Intent();
intent.setPackage("應用包名");
intent.setAction("消息action");
sendBroadcast(intent);
三、指定某一個receiver允許接收。
解決方案:intent 指定包名Intent. setComponent設置廣播僅對相同包名的有效
優點:
1.可以指定到具體某一個receiver,安全性更高
2.receiver可以是靜態註冊也可以是動態註冊。
缺點:
1.它只能指定一個receiver,侷限性較大
使用實例:
Intent intent = new Intent();
intent. setComponent(newComponentName("包名", "Receiver類名"));
intent.setAction("消息action");
sendBroadcast(intent);
四、指定多個應用有權接收。
解決方案:sendBroadcast(Intent, String)的接口在發送廣播時指定接收者必須具備的permission。如果擔心反編譯後,權限被竊取,限制失效。可以在聲明權限時,提高權限的
leverl爲簽名驗證,即只有相同簽名的應用且有該權限才能夠接收,這樣就能夠滿足產品簇的問題。
使用實例:
AndroidManifest.xml
<permission android:description="@string/XXX"
android:label="XXXX"
android:name=" com.test.permission"
android:protectionLevel=" signature">
<receiver
android:name="XXXX"
android:permission="com.test.permission" >
<intent-filter >
<actionandroid:name="XXXXX" />
</intent-filter>
</receiver>
Intent intent = new Intent();
intent.setAction("消息action");
sendBroadcast(intent, "com.test.permission");
注意:如果要求安全級別較高,使用簽名驗證機制即使優點又是缺點。目前還沒有找到更好的方法,能夠滿足多個指定應用都能夠接收消息,且安全級別不會受到僞造或竊取的風險。