簡要理解AbstractProcessor是什么可以參考:blog.csdn.net/industriously/article/details/53932425
首先先創建一個項目命名PermissionHelper,添加一個基礎Activity即可。其次項目根目錄右鍵新建一個module
選擇java Library我們暫且命名為compiler,
上一步完成后,還要再新建一個Java Library我們暫且命名為annotation,顧名思義,注解的module
并且在【annotation】module新建三個注解分別為:
接著我們要把【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實現
最后寫一個權限申請的的流程
需要在activity或者fragment的onPermissionRequestReresult中回調過來,可以封裝到baseActivity
權限申請回調過來后,我們要手動反射加載手動寫入代碼的類
最后,也就是去執行
最后上一張運行時GIF
github傳送門:github.com/mrme2014/PermissionHelper
##### 關注微信公眾號,每天分享優質文章