安卓自定义权限的使用
前言
安卓框架制定了很多权限供我们在需要时使用,同时我也可以为自己应用中的组件加上自定义权限。
- 提供对外接口时,为对应服务添加权限,供用户调用
- 同公司多应用跨进程数据传输(广播方式),考虑广播安全性,通常会加权限
本文以自定义权限在activity和Broadcast中的应用演视其使用方法
activity中使用方法
以下我们在service端自定义一个打开activity的权限
client端使用点击button跨进程开启service端这个自定权限的activity
service端:定义并使用权限
在service端创建一个activity
注意这个activity不能是自带的MainAcitivy需要另外创建一个
在AndroidManifest.xml中manifest标签下定义权限
//android:protectionLevel表示权限级别,通常我们使用normal和signature //如果protectionLevel="signature"表示要使用该权限,应用签名必须定义权限的程序签名相同 <permission android:name="feadre.permission.START_PER_ACTIVITY" android:protectionLevel="signature" />
注意:权限的命名建议参照android的权限命名方式,公司名+permission+WHAT,否则有可能出现权限无法使用的问题
在需要被远程调用的activity标签中添加android:permission属性,表示如果要跨进程启动这个activity必须要有feadre.permission.START_PER_ACTIVITY权限
<activity android:name=".PerActivity" android:permission="feadre.permission.START_PER_ACTIVITY"> <intent-filter> <action android:name="action.activity"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
注意:为了让activity可以远程启动,需要在添加action标签和category标签,否则无法启动,如果定义时使用了android:protectionLevel=”signature”,那么client端必须与service端使用相同的签名
client端:声明使用权限
在AndroidManifest.xml中manifest标签下定义并使用权限
<permission android:name="feadre.permission.START_PER_ACTIVITY/> <uses-permission android:name="feadre.permission.START_PER_ACTIVITY"/>
注意:这里必须permission和uses-permission同时使用才有效
在client端设置一个button,在代码onClick中,开启service端activity
Intent intent = new Intent("action.activity"); startActivity(intent);
使用方法和正常启动activity一致,因为我们已经在AndroidManifest.xml声明了权限所有可以直接打开,比较简单就不截图了
Broadcast中使用方法
我们知识通常我的指的广播是service端所有发送reciver端都可以收到,所有自定义权限在广播中根据应用需求及安全性考虑主要有三种用法,分别为接收端定义权限、发送端定义权限和发送接收都定义权限
接收端定义权限—表示只接收intent和自定义权限同时匹配的广播
接收端-两种实现方式
静态注册方式
接收端定义权限接收权限
在AndroidManifest.xml中manifest标签下定义 <permission android:name="feadre.permission.BORADCAST_RECIVER"/>
BoradcastReciver指定自定义权限
<receiver android:name=".receiver.StaticReceiver" android:permission="feadre.permission.BORADCAST_RECIVER"> <intent-filter> <action android:name="action.boradcast"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </receiver>
动态注册方式-无需AndroidManifest.xml中声明直接指定权限
DynamicReceiver receiver1 = new DynamicReceiver(); IntentFilter filter1 = new IntentFilter("action.boradcast"); filter1.addCategory(Intent.CATEGORY_DEFAULT); registerReceiver(receiver1, filter1, "feadre.permission.BORADCAST_RECIVER", null);
两种注册方式的区别和普通BoradcastReciver一样,静态注册的广播常驻内存,应用关闭仍然继续接收,动态注册的广播应用关闭广播也停止接受。具体应用场景根据业务需求
发送端
在AndroidManifest.xml中manifest标签下定义并使用权限
<permission android:name="feadre.permission.BORADCAST_RECIVER"/> <uses-permission android:name="feadre.permission.BORADCAST_RECIVER"/>
声明了权限后即可正常发送广播,发送广播方式普通广播没有区别
Intent intent2 = new Intent(); intent2.setAction("action.boradcast"); intent2.addCategory("android.intent.category.DEFAULT"); sendBroadcast(intent2);
发送端定义权限—接收端不声明权限不能接收
发送端
发送广播时带上权限-无需声明权限
Intent intent2 = new Intent(); intent2.setAction("action.boradcast"); intent2.addCategory("android.intent.category.DEFAULT"); sendBroadcast(intent2,"feadre.permission.BORADCAST_SEND");
接收端
在AndroidManifest.xml中manifest标签下定义并使用权限
<permission android:name="feadre.permission.BORADCAST_SEND"/> <uses-permission android:name="feadre.permission.BORADCAST_SEND"/>
使用方法与普通广播一致,可以动态和静态注册
DynamicReceiver receiver1 = new DynamicReceiver(); IntentFilter filter1 = new IntentFilter("action.boradcast"); filter1.addCategory(Intent.CATEGORY_DEFAULT); registerReceiver(receiver1, filter1);
发送接收都定义权限-设置方式就是上述两方式的结合有点小区别不再详述
- 发送端
- 在AndroidManifest.xml中manifest标签下定义并使用接收(接收者定义的)权限
- 发送广播时带上发送权限
- 接收端
- 在AndroidManifest.xml中manifest标签下定义并使用发送(发送者定义的)权限
- 可以动态和静态注册,定义接收时带上权限即可
结语
到这相信大家对自定义权限的使用已经非常了解了,自定义权限还可用于service和provider组件使用方法是一样的,另外由于demo中包含跨进程的内容,将在后续提供下载,敬请关注,如需转载请标明出处,谢谢!