美文网首页Android开发经验谈半栈工程师Android技术知识
AbstractProcessor实现编译时注解注入权限申请

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

作者: 蓅哖伊人为谁笑 | 来源:发表于2017-10-10 11:28 被阅读529次

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

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

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

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

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

    PermissionDenied权限被拒绝 PermissionGrant授予权限 ShowRequestPermissionRationale权限申请说明

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

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

    到这里配置完成后就可以编写处理器代码了

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    proxyInfo类中的 代码写入文件头部 包名,类名,实现 泛型类型

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

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

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

    最后,也就是去执行

    最后上一张运行时GIF

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

    相关文章

      网友评论

        本文标题:AbstractProcessor实现编译时注解注入权限申请

        本文链接:https://www.haomeiwen.com/subject/qeqvyxtx.html