AbstractProcessor实现编译时注解注入权限申请

简要理解AbstractProcessor是什么可以参考:blog.csdn.net/industriously/article/details/53932425

首先先创建一个项目命名PermissionHelper,添加一个基础Activity即可。其次项目根目录右键新建一个module

选择java Library我们暂且命名为compiler,

AbstractProcessor实现编译时注解注入权限申请_第1张图片

上一步完成后,还要再新建一个Java Library我们暂且命名为annotation,顾名思义,注解的module

并且在【annotation】module新建三个注解分别为:

AbstractProcessor实现编译时注解注入权限申请_第2张图片
PermissionDenied权限被拒绝
AbstractProcessor实现编译时注解注入权限申请_第3张图片
PermissionGrant授予权限
AbstractProcessor实现编译时注解注入权限申请_第4张图片
ShowRequestPermissionRationale权限申请说明

接着我们要把【annotation】作为【compiler】的依赖库,并添加google提供了一个注册处理器的库

compile ‘com.google.auto.service:auto-service:1.0-rc2‘

AbstractProcessor实现编译时注解注入权限申请_第5张图片
到这里配置完成后就可以编写处理器代码了

新建PermissionProcessor,在类名配置@AutoService(Processor.class)  ,这属于编译时处理器标配吧

初始化得到元素操作类,日志输出工具

AbstractProcessor实现编译时注解注入权限申请_第6张图片

接下来是告诉处理器声明我们需要处理的注解类型

AbstractProcessor实现编译时注解注入权限申请_第7张图片

然后是告诉处理器支持的资源版本号,一贯就是latestSupported()

然后是分别处理我们自定义的三个注解,得到注解标致的value值也就是权限requestCode和声明的方法名,装载到mProxyMap集合中

代码中的roundEnv.getElementsAnnotatedWith返回的其实就是每个注解所标注的方法元素集合,是可以强转为ExecutableElement的

element有多个子集,介绍几个常见的

TypeElement------类型元素,注意枚举对应的时类,注解对应的接口

ExecutableElement------一般是指可执行的方法元素

VariableElement------一般指常量,变量 ,异常对象元素

pakeageElement-----一般指包元素,可以获得包信息

TypeParamterElement----这个也是比较常用的,一般指继承类实现的接口,或者泛型对象元素

AbstractProcessor实现编译时注解注入权限申请_第8张图片

最后就是把三个注解标记的方法以及requestCode 以key-value装在到map集合后,开始对每个以类名为key的proxyInfo执行文件写入

AbstractProcessor实现编译时注解注入权限申请_第9张图片

然后看一下proxyInfo这个类,他就是封装了一下 代码写入文件的工作,我们的代码自动写入工作就完成了

AbstractProcessor实现编译时注解注入权限申请_第10张图片

还没完,我们还没写权限怎么申请的呢,O(∩_∩)O哈哈~,项目根目录右键new mudule--->android library,我们命名为libpermission

并引入【annotation】作为依赖库,新建PermissionProxy接口,目的是为了ProxyInfo中的代码写入文件时 的implements实现

AbstractProcessor实现编译时注解注入权限申请_第11张图片
AbstractProcessor实现编译时注解注入权限申请_第12张图片
proxyInfo类中的 代码写入文件头部 包名,类名,实现 泛型类型

最后写一个权限申请的的流程

AbstractProcessor实现编译时注解注入权限申请_第13张图片

需要在activity或者fragment的onPermissionRequestReresult中回调过来,可以封装到baseActivity

AbstractProcessor实现编译时注解注入权限申请_第14张图片

权限申请回调过来后,我们要手动反射加载手动写入代码的类

AbstractProcessor实现编译时注解注入权限申请_第15张图片

最后,也就是去执行

AbstractProcessor实现编译时注解注入权限申请_第16张图片

最后上一张运行时GIF


github传送门:github.com/mrme2014/PermissionHelper

##### 关注微信公众号,每天分享优质文章![image.png](https://upload-images.jianshu.io/upload_images/2432544-a994bfdf50a2a827.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

你可能感兴趣的:(AbstractProcessor实现编译时注解注入权限申请)