Android 采用采用AOP方式封装方式封装6.0权限管理的方法权限管理的方法
主要介绍了Android 采用AOP方式封装6.0权限管理的方法,小编觉得挺不错的,现在分享给大家,也给大家做
个参考。一起跟随小编过来看看吧
【一】背景【一】背景
6.0运行时申请权限已经是一个老生常谈的内容了,最近项目TargetSDKVersion升到23以上,所以我们也需要做权限管理,我
想到的需求是这样的:
1、支持单个权限、多个权限申请
2、运行时申请
3、无侵入式申请,无需关注权限申请的逻辑
4、除了Activity、Fragment之外,还需要支持Service中申请
5、对国产手机做兼容处理
第一、二点,Google都有对应的API;
第三点可以通过自定义注解+AOP切面方式来解决。为什么采用AOP方式呢?首先看AOP定义: 面向切面编程(Aspect-Oriented
Programming)。如果说,OOP(面向对象)如果是把问题划分到单个模块的话,那么AOP就是把涉及到众多模块的某一类问
题进行统一管理。 因为我们申请权限的逻辑都是基本一样的,所以可以把申请权限的逻辑统一管理。
第四点稍微有点麻烦,因为Google提供的API只支持在Activity和Fragment中去申请权限,Service中并没有相应的API,比如
项目中的某个Service里需要拿到当前位置信息,并且不能确定定位权限已经给了,所以在定位之前仍然需要判断有没有定位
权限,按照常规逻辑好像是行不通了。肿么办呢?先说一下我想到的办法:通过一个透明的Activity去申请权限,并且把申请
结果返回来,最后实践也是这么做的,具体思路请往下看。
第五点也比较麻烦,如果都按Google标准来,那就不用考虑兼容问题了,但是国产安卓手机碎片化比较严重,且基本都修改
了ROM,导致申请权限的API跟期望返回的结果不一致,这种的可能就需要特殊处理了。
调研了一下比较流行的三方库,如PermissionsDispatcher 、RxPermissions ,做了一个简单的总结:
权限库权限库 是否使用注解是否使用注解 是否支持链式调用是否支持链式调用 是否支持是否支持Service 是否适配国产机是否适配国产机
RxPermissions No Yes No No
PermissionsDispatcher Yes No No 适配了小米
RxPermissions是基于RX的思想,支持链式调用,简单方便,但是他不支持Service调用;PermissionsDispatcher使用了编译
时解析注解的方式,通过apt自动生成.class方式帮我们去写申请权限的逻辑,很好很强大,并且适配了小米手机,但是它也不
支持Service中去申请权限。考虑到我们项目中的应用场景并且借鉴了PermissionsDispatcher的申请权限的逻辑,决定基于
AOP方式手动撸一个权限管理库出来。
【二】效果图【二】效果图
先上一下最终的效果图: