WMRouter閱讀筆記

主要參考文章:
WMRouter源碼分析(1)-基本結(jié)構(gòu)分析
WMRouter 整體理解可分4步:這里寫了大致流程握侧,細節(jié)請結(jié)合代碼
1柑爸、注解部分 - 編譯時注解
2企蹭、插件源碼部分
3雳攘、初始化
4、使用

1任柜、注解部分 - 編譯時注解

基礎(chǔ)篇:帶你從頭到尾玩轉(zhuǎn)注解
利用javapoet卒废,根據(jù)注解參數(shù),生成java文件;
UriAnnotationProcessor把有RouterUri注解的文件宙地,生成ServiceInit_eb71854fbd69455ef4e0aa026c2e9881.java, UriAnnotationInit_43645645645646456.java

public class ServiceInit_eb71854fbd69455ef4e0aa026c2e9881 {
  public static void init() {
    ServiceLoader.put(IUriAnnotationInit.class, "com.sankuai.waimai.router.generated.UriAnnotationInit_72565413b8384a4bebb02d352762d60d", com.sankuai.waimai.router.generated.UriAnnotationInit_72565413b8384a4bebb02d352762d60d.class, false);
  }
}
public class UriAnnotationInit_72565413b8384a4bebb02d352762d60d implements IUriAnnotationInit {
  public void init(UriAnnotationHandler handler) {
    handler.register("", "", "/show_toast_handler", new ShowToastHandler(), false);
    handler.register("", "", "/login", "com.sankuai.waimai.router.demo.advanced.account.LoginActivity", false);
    handler.register("", "", "/account_with_login", "com.sankuai.waimai.router.demo.advanced.account.UserAccountActivity", false, new LoginInterceptor());
  }
}

2摔认、插件源碼部分:

Gradle Transform API 的基本使用
插件源碼 遍歷jar文件com.sankuai.waimai.router.generated.service目錄下 的 ServiceInit_XXXX 的文件,再使用 asm生成下面的ServiceLoaderInit.class文件

public class ServiceLoaderInit {
    public static void init() {
        ServiceInit_aea7f96d0419b507d9b0ef471913b2f5.init();
        ServiceInit_f3649d9f5ff15a62b844e64ca8434259.init();
        ServiceInit_eb71854fbd69455ef4e0aa026c2e9881.init();
        ServiceInit_b57118238b4f9112ddd862e55789c834.init();
        ServiceInit_f1e07218f6691f962a9f674eb5b4b8bd.init();
        ServiceInit_4268a3e74040533ba48f2e1679155468.init();
        ServiceInit_e694d982fb5d7a3a8c6b7085829e74a6.init();
        ServiceInit_ee5f6404731417fe1433da40fd3c9708.init();
        ServiceInit_9482ef47a8cf887ff1dc4bf705d5fc0a.init();
        ServiceInit_36ed390bf4b81a8381d45028b37cc645.init();
    }
}

3宅粥、初始化:

// application 中初始化
Router.init(rootHandler);
new AsyncTask<Void, Void, Void>() { // 懶加載后臺初始化(可選)
    @Override
    protected Void doInBackground(Void... voids) {
        Router.lazyInit();
        return null;
    }
}.execute();

//Router.java
public static void lazyInit() {
    ServiceLoader.lazyInit();
    getRootHandler().lazyInit();
}

ServiceLoader.lazyInit() 中 使用反射 調(diào)用 插件生成的ServiceLoaderInit.init()参袱,加載所有服務(wù); getRootHandler().lazyInit();從前面加載的服務(wù)中查找 有關(guān)服務(wù),調(diào)用ServiceInit_XXXX的init()秽梅,繼而調(diào)用UriAnnotationInit_72565413b8384a4bebb02d352762d60d.init(UriAnnotationHandler handler)抹蚀,注冊各種handler 進 roothandler 中的各種分類handler中;

public DefaultRootUriHandler(Context context,
                             @Nullable String defaultScheme, @Nullable String defaultHost) {
    super(context);
    mPageAnnotationHandler = createPageAnnotationHandler();
    mUriAnnotationHandler = createUriAnnotationHandler(defaultScheme, defaultHost);
    mRegexAnnotationHandler = createRegexAnnotationHandler();
    // 按優(yōu)先級排序企垦,數(shù)字越大越先執(zhí)行
    // 處理RouterPage注解定義的內(nèi)部頁面跳轉(zhuǎn)环壤,如果注解沒定義,直接結(jié)束分發(fā)
    addChildHandler(mPageAnnotationHandler, 300);
    // 處理RouterUri注解定義的URI跳轉(zhuǎn)钞诡,如果注解沒定義郑现,繼續(xù)分發(fā)到后面的Handler
    addChildHandler(mUriAnnotationHandler, 200);
    // 處理RouterRegex注解定義的正則匹配
    addChildHandler(mRegexAnnotationHandler, 100);
    // 添加其他用戶自定義Handler...
    // 都沒有處理,則嘗試使用默認的StartUriHandler直接啟動Uri
    addChildHandler(new StartUriHandler(), -100);
    // 全局OnCompleteListener荧降,用于輸出跳轉(zhuǎn)失敗提示信息
    setGlobalOnCompleteListener(DefaultOnCompleteListener.INSTANCE);
}

2接箫、使用:

Router.startUri(uriRequest);

從roothandler 中各個分handler 中查找能處理 請求的 handler。
至于查找過程則是 遍歷+ 遞歸

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朵诫,一起剝皮案震驚了整個濱河市辛友,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剪返,老刑警劉巖废累,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邓梅,死亡現(xiàn)場離奇詭異,居然都是意外死亡九默,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門宾毒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驼修,“玉大人,你說我怎么就攤上這事诈铛∫腋鳎” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵幢竹,是天一觀的道長耳峦。 經(jīng)常有香客問我,道長焕毫,這世上最難降的妖魔是什么蹲坷? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮邑飒,結(jié)果婚禮上循签,老公的妹妹穿的比我還像新娘。我一直安慰自己疙咸,他們只是感情好县匠,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撒轮,像睡著了一般乞旦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上题山,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天兰粉,我揣著相機與錄音,去河邊找鬼顶瞳。 笑死亲桦,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的浊仆。 我是一名探鬼主播客峭,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抡柿!你這毒婦竟也來了舔琅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤洲劣,失蹤者是張志新(化名)和其女友劉穎备蚓,沒想到半個月后课蔬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡郊尝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年二跋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片流昏。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡扎即,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出况凉,到底是詐尸還是另有隱情谚鄙,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布刁绒,位于F島的核電站闷营,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏知市。R本人自食惡果不足惜傻盟,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嫂丙。 院中可真熱鬧莫杈,春花似錦、人聲如沸奢入。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腥光。三九已至关顷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間武福,已是汗流浹背议双。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捉片,地道東北人平痰。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像伍纫,于是被迫代替她去往敵國和親宗雇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355