概述
比如在當前 Activity 下動態(tài)注冊一個廣播,我們會這樣做
this.registerReceiver(receiver, filter)
這樣的話,這個 receiver 組件是完全公開的,不僅僅我們的應用可以向它發(fā)送數(shù)據(jù),外部應用也可以指定相應的 action 來向它發(fā)送惡意數(shù)據(jù)
為了提高安全性,則需要對其進行權限限制,有兩種措施
方案一
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)
該方法還是允許接收外部的廣播,但添加了權限來進行限制
在動態(tài)注冊中的代碼
BroadcastReceiver receiver = new CBroadcastReceiver();
Handler handler = new CHandler();
IntentFilter filter = new IntentFilter();
filter.addAction("com.mirror.js");
String permission = "com.mirror.js.permission";
context.register(receiver, filter, permission, handler);
如果使用的是靜態(tài)注冊,那就是這樣
<permission android:name = "com.mirror.js.permission"/>
...
<receiver android:name="CBroadcastReceiver" android:permission="com.mirror.js.permission">
<intent-filter>
<action android:name="com.mirror.js" />
</intent-filter>
</receiver>
這樣的話,只有擁有了 “com.mirror.js.permission” 的權限的應用才能給該 BroadcastReceiver 發(fā)廣播
Intent intent = new Intent();
intent.setAction("com.mirror.js");
sendBrocast(intent, "com.mirror.js.permission");
方案二
LocalBroadcastManager
這是一個工具類,可以用來限制 BroadcastReceiver 的使用,只能應用內(nèi)發(fā)送和接收廣播
注冊廣播
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(context);
BroadcastReceiver receiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.mirror.js");
manager.register(receiver, filter);
發(fā)送廣播
Intent intent = new Intent();
intent.setAction("com.mirror.js");
manager.sendBrocast(intent);