通常我們發(fā)送一個(gè)廣播宣旱,都是直接
Intent intent = new Intent("action");
intent.putExtra("key", "value");
sendBroadcast(intent);
我也是一直這樣用仅父,但是這樣會有風(fēng)險(xiǎn)叛薯,設(shè)想這樣一種情形浑吟,A app發(fā)出一個(gè)廣播甲,里面包含保密信息若干耗溜,我想獲取它组力,怎么辦呢?在知道你甲廣播action的情況下抖拴,我搞一個(gè)B app燎字,里面注冊一個(gè)廣播接收器,那么只要A app發(fā)出廣播阿宅,B app立馬可以攔截
所以候衍,風(fēng)險(xiǎn)就是廣播泄漏
,怎么解決洒放?思路如下:
1.自定義一個(gè)權(quán)限
2.發(fā)送廣播時(shí)蛉鹿,聲明需要具備這個(gè)權(quán)限的接收器才能接收這個(gè)廣播
實(shí)現(xiàn)如下:
聲明自定義權(quán)限
<!--
nama==權(quán)限名稱
protectionLevel==權(quán)限級別 signature表示只有擁有相同簽名文件的app才能使用該權(quán)限,防止別人知道你的權(quán)限往湿,再次造成廣播泄漏
-->
<permission
android:name="test.permission"
android:protectionLevel="signature" />
這個(gè)權(quán)限聲明妖异,網(wǎng)上的資料并沒有明確需要放在哪個(gè)Manifest文件里面,我甚至有看到放在多個(gè)Manifest里面的领追。經(jīng)過實(shí)驗(yàn)他膳,放在哪都行(app或者module),但是只要一個(gè)地方聲明即可绒窑,不要到處寫
發(fā)送廣播
Intent intent = new Intent("action");
intent.putExtra("key", "value");
sendBroadcast(intent, "test.permission");
在這里棕孙,需要把你聲明的權(quán)限加入到sendBroadcast里面,就是告訴別人沒權(quán)限不接收
接收廣播
在Receiver所在的module
里面的Manifest文件些膨,引用一下聲明好的自定義權(quán)限如下
<uses-permission android:name="test.permission" />
如果是靜態(tài)注冊
<receiver android:name=".TestBroadcastReceiver"
android:exported="false"
android:permission="test.permission">
<intent-filter>
<action android:name="action" />
</intent-filter>
</receiver>
如果是動(dòng)態(tài)注冊
myReceiver = new MyReceiver();
IntentFilter filter = new IntentFilter("action");
registerReceiver(myReceiver, filter, "test.permission", null);
請注意android:permission="test.permission">和registerReceiver(myReceiver, filter, "test.permission", null);這兩個(gè)地方散罕,網(wǎng)上的資料,都是這樣的寫法傀蓉,但是通過實(shí)驗(yàn)欧漱,我發(fā)現(xiàn)只要Manifest引用了自定義權(quán)限,完全不需要再對同一個(gè)module的接收器聲明權(quán)限葬燎,即如下
靜態(tài)注冊
<receiver android:name=".TestBroadcastReceiver"
android:exported="false">
<intent-filter>
<action android:name="action" />
</intent-filter>
</receiver>
動(dòng)態(tài)注冊
myReceiver = new MyReceiver();
IntentFilter filter = new IntentFilter("action");
registerReceiver(myReceiver, filter);
同樣是可以順利地接收到對應(yīng)的廣播,反之如果不在Manifest里面引用自定義權(quán)限误甚,即便在接收器里面寫了權(quán)限缚甩,也無法接收
不知道是否我代碼有誤,或是系統(tǒng)版本問題(目前嘗試了7.0窑邦、8.0)擅威,如果有大神知道,望斧正冈钦,感激不盡
至此郊丛,廣播泄漏問題初步解決