Android輕量級路由框架LiteRouter

分類:技術 時間:2016-10-24

LiteRouter

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

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

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

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

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

如果你用過一些路由框架,比如 RouterAndRouteActivityRouter ,它們和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(quot;com.hiphonezhu.test.demo.ActivityDemo2quot;)
  @RequestCode(100)
  void intent2ActivityDemo2(@Key(quot;platformquot;) String platform, @Key(quot;yearquot;) 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(quot;androidquot;, 2016);

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

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

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

更多用法

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

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

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

Step2:

IntentWrapper intentWrapper = intentService.intent2ActivityDemo2Raw(quot;androidquot;, 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(Context context, String className, Bundle bundle) {
       return false;
   }
}).build();

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

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

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

源碼在 Android-BaseLine ,它是這個快速開發框架中的一個模塊。


Tags: 安卓開發

文章來源:http://www.jianshu.com/p/79e9a54e85b2


ads
ads

相關文章
ads

相關文章

ad