在用户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!