十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
前言
什么是Apt
APT從原理上講是一個(gè)編譯期的注解處理工具(Annotation Processing Tool)。一些主流的三方庫(kù)(ButterKnife,Glide)都用到了這個(gè)技術(shù)來(lái)生成代碼。
Apt有什么好處
Gradle腳本中的apt和annotationProcessor
這兩個(gè)從廣義上說(shuō)都是編譯期的注解處理工具。只不過(guò)android-apt(其實(shí)是一個(gè)gradle插件,apt是插件命令)是早期的github的一個(gè)開(kāi)源項(xiàng)目,annotationProcessor是gradle build tools 2.2之后自帶的編譯期注解工具(官方支持的,可替代開(kāi)源的gradle插件android-apt)。android-apt的作者已經(jīng)發(fā)表聲明表示Android Studio插件已經(jīng)支持annotationProcessor,并且會(huì)警告和阻止使用android-apt??偟膩?lái)說(shuō),看你的gradle build tools的版本,低版本用android-apt(需要引入插件),高版本用annotationProcessor(無(wú)需引入插件)
代碼設(shè)計(jì)
需求分析
這里將route模塊分成三部分(一個(gè)android library,兩個(gè)java library)
1、router-annotation(java library)
這里java工程里面只放注解的聲明類。這里只實(shí)現(xiàn)了兩個(gè)注解RouterActivity、RouterField。
2、router-compiler (java library)
這個(gè)工程是編譯期依賴的工程,作用是編譯期掃描代碼,根據(jù)RouterActivity、RouterField這兩個(gè)注解的使用,生成相關(guān)代碼。這里需要講下如何掃描代碼并且生成代碼的。這部分功能的實(shí)現(xiàn)主要依賴兩個(gè)庫(kù):Google的auto-service(掃描代碼),Squareup的javapoet(生成代碼)
3、router (android library)
主要邏輯代碼。在這個(gè)模塊中會(huì)定義一些功能類和接口。router-compiler模塊可以根據(jù)這些接口和功能類generate邏輯代碼。需要注意的是router-compiler是不需要依賴router的,router-compiler是根據(jù)包名+類名的方式獲取類的。
代碼實(shí)現(xiàn)
router-annotation
RouterActivity是一個(gè)注解,用此注解修飾的Activity根據(jù)指定的路由地址,會(huì)自動(dòng)添加到路由表中,當(dāng)系統(tǒng)掛載了路由表之后,就可根據(jù)指定的路由地址來(lái)訪問(wèn)特定的Activity了。代碼如下:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface RouterActivity { String[] value(); }