在用戶app中,自定義權限每每設定在 四大組件上Activity,Service,BroadcastReceiver,ContentProvider,做爲app的一部分,若是不容許組件被其餘調用,設置權限也是一種保護方式。html
在這裏咱們以BroadcastReceiver爲例,假定其屬於appA:java
package test.common.home; public class StickyBroadcastReceiver extends BroadcastReceiver { public static final String Action = "com.sample.test.sticky.broadcast.receiver"; public static final String PERMISSION = "com.sample.test.permission.sticky.receiver"; @Override public void onReceive(Context context, Intent intent) { int checkCallingOrSelfPermission = context.checkCallingOrSelfPermission(PERMISSION); //權限的檢測(實際上,這種檢測系統會自動檢測,若是經過的話纔會調用onReceive方法,咱們這裏特地指出,就是爲了明白系統檢測方式是怎樣的) //若是要檢測出2種效果,只能使用該BroadcastReceiver自身應用來實現,由於自身應用沒權限也可訪問該廣播 if(PackageManager.PERMISSION_GRANTED == checkCallingOrSelfPermission) { Toast.makeText(context, "受權成功", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(context, "受權失敗", Toast.LENGTH_SHORT).show(); } if(intent!=null&&Action.equals(intent.getAction())) { Toast.makeText(context, intent.getStringExtra("info"), Toast.LENGTH_SHORT).show(); } } }
在到Manifest.xml文件中註冊android
首先自已權限並使用自定義權限app
<permission android:name="com.sample.test.permission.sticky.receiver" android:protectionLevel="normal" /> <uses-permission android:name="com.sample.test.permission.sticky.receiver"/>
而後註冊廣播ide
<receiver android:name="test.common.home.StickyBroadcastReceiver" android:exported="true" android:permission="com.sample.test.permission.sticky.receiver" > <intent-filter > <action android:name="com.sample.test.sticky.broadcast.receiver"/> </intent-filter> </receiver>
屬性說明測試
android:exported="true" --->是否外部容許訪問,低版本中默認是true,高版本默認是false,請注意 android:permission="com.sample.test.permission.sticky.receiver" --->外部訪問是須要檢測的權限
而後咱們建立appB,在appB中建立一個Activity用來發送廣播:spa
Intent intent = new Intent(StickyBroadcastReceiver.Action); intent.putExtra("info", "hello world"); sendBroadcast(intent);
測試一:將appA中的StickyBroadcastReceiver設置爲android:exported設置爲false,不設置權限android:permissioncode
測試結果,發送廣播失敗:orm
Permission Denial: Accessing service ComponentInfo java.lang.SecurityException: Not allowed to bind to service Intent
測試二:將appA中的StickyBroadcastReceiver設置爲android:exported=true,不設置權限android:permissionxml
測試結果:
廣播接收正常
測試三:將appA中的StickyBroadcastReceiver設置爲android:exported設置爲true,設置權限android:permission="com.sample.test.permission.sticky.receiver"
在appB中不設置<uses-permission android:name="com.sample.test.permission.sticky.receiver"/>
測試結果
Permission Denial
測試四:在測試三的基礎上在AppB設置
<uses-permission android:name="com.sample.test.permission.sticky.receiver"/>
測試結果:廣播接收正常
由上可知,權限運行正常,因此你能夠試試了。
附加:
android:protectionLevel --->保護級別,看這裏http://www.xuebuyuan.com/1873075.html
try doing it!