Android輕量級路由框架LiteRouter

LiteRouter

開始之前,我們介紹一下什么是“路由”?

路由這個概念來自于Web前端開發,引用知乎網友的解答

不同的請求地址會交給路由處理來轉發給相應的控制器處理,所以說路由就可以在轉發前修改轉發地址,你可以在這上面大作文章。

簡單的概括:路由是一個框架,可以控制、轉發對頁面的跳轉,并在跳轉之前做任何你想要的處理。

那么,Android中為何要引入一個Web中才有的路由概念?

如果你用過一些路由框架,比如Router、AndRouteActivityRouter,它們和Web中的路由框架強調的思想很類似,注重動態跳轉(比如服務器下發跳轉路徑)、統一轉發等。

LiteRouter關注的有些許不同:

我們在團隊的開發過程中,可能會遇到一些“航母級”的App,涉及到很多業務線,N個團隊的合作開發,這時候如果還是“單”App的開發模式,會遇到各個業務代碼冗雜、編譯時間幾何級上漲、發布版本需要全量測試等問題。

為了解決這個問題,出現了很多關于組件化開發的思想:

各個業務線團隊專注自己的開發,在開發期間可以看做一個單獨的App(獨立開發,獨立測試),發布時又會作為了個library,被引入到最終的App中。

這里會涉及到很多問題,比如公共資源、公共庫的設計、跨業務的界面跳轉等。關于組件化開發,可以參考這個文章:Android業務組件化開發實踐

LiteRouter關注的正是如何在各個業務獨立的情況下,實現跨業務界面跳轉這一問題:

Android中通常的界面跳轉指的是Activity控制器的處理,我們知道一般情況下需要知道要跳轉的目標Activity,以及傳遞的參數內容等,這個與組件化開發思想中,業務線獨立開發顯然是違背的。

那么我們如何才能解決此問題呢?

前幾天寫Retrofit2源碼分析這篇文章的時候,突然給了我靈感,App端的開發和后臺的開發不就是獨立的?那么,它們是如何互相“獨立”最終又互相配合的呢?

顯然是依靠我們的接口設計規約~ 那么如果我們也能像Retrofit那樣,定義好Activity跳轉的接口方法,然后調用此方法就能實現跳轉,這豈不是就能解決我們的問題,于是LiteRouter誕生了~

LiteRouter基本使用

Step1:定義Activity跳轉的接口

public interface IntentService {
  @ClassName("com.hiphonezhu.test.demo.ActivityDemo2")
  @RequestCode(100)
  void intent2ActivityDemo2(@Key("platform") String platform, @Key("year") int year);
}

注解介紹:

  • @ClassName:要跳轉的Activity的完整路徑。
  • @RequestCode:需要返回值,即startActivityForResult,如果不添加,則使用startActivity。
  • @Key:Intent傳遞的參數的key(支持Intent可傳遞的所有格式)。

Step2:創建服務對象

LiteRouter liteRouter = new LiteRouter.Builder().build();
IntentService intentService = liteRouter.create(IntentService.class, ActivityDemo4.this);

ActivityDemo4.this為當前的Activity。

Step3:Activity跳轉

intentService.intent2ActivityDemo2("android", 2016);

有了這樣一個約束,就好比一份接口設計文檔,各個業務方之間可以根據需求,協商好跨業務之間的Activity跳轉以及參數傳遞的規范問題。

不管對于調用方,還是最終跳轉方,都可以根據這個接口定義,保持業務線的獨立開發。

這份接口定義可以放在公共的庫,便于業務需求的隨時變更,只要接口定義方及時通知調用方即可,這和App與后臺接口的交互的開發方式非常類似。

更多用法

  • Activity Flag設置
  • 轉場動畫
  • 其他原生的Intent或Activity的用法

Step1:定義方法的返回類型為IntentWrapper

public interface IntentService { 
  @ClassName("com.hiphonezhu.test.demo.ActivityDemo2")     
  @RequestCode(100) 
  IntentWrapper intent2ActivityDemo2Raw(@Key("platform") String platform, @Key("year") int year);
}

Step2:

IntentWrapper intentWrapper = intentService.intent2ActivityDemo2Raw("android", 2016);
// Intent intent = intentWrapper.getIntent();  // 原始intent,可以做任何處理
// 添加flags
intentWrapper.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
// 啟動Activity
intentWrapper.start();
  • 攔截器支持
LiteRouter liteRouter = new LiteRouter.Builder().interceptor(new Interceptor() {
   @Override
   public boolean intercept(IntentWrapper intentWrapper) {
       return false;
   }
}).build();

intercept方法返回false表示不做攔截,true表示攔截跳轉。

這里,可以做全局統一的處理,比如用戶未登錄,你可以使用intentWrapper#setClassName方法,修改為登錄的Activity,強制用戶去登陸。

LiteRouter的原理和Retrofit非常一致,最重要的都是通過動態代理來實現接口的方法,這里不做過多介紹,感興趣的同學可以看下源碼(代碼行很少~)。

源碼:LiteRouter

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,420評論 25 708
  • 前言 隨著用戶的需求越來越多,對App的用戶體驗也變的要求越來越高。為了更好的應對各種需求,開發人員從軟件工程的角...
    一縷殤流化隱半邊冰霜閱讀 87,452評論 214 1,098
  • 原文鏈接:https://github.com/halfrost/Halfrost-Field/blob/mast...
    hament閱讀 5,720評論 1 31
  • 朋友就是并不時常想起,但卻無處不在!這就是朋友帶給我們的一個同在感!這才是真正的朋友!我們之所以交朋友是因為愛。愛...
    田云南閱讀 141評論 0 0
  • 剛剪了一個月的頭發,現在又該剪了。從小,我的頭發和指甲都長得特別快,老人們說,心閑長頭發,人閑長指甲。我承認我一直...
    seacole閱讀 332評論 0 1