LiteRouter
開始之前,我們介紹一下什么是 “路由” ?
路由這個概念來自于Web前端開發,引用知乎網友的 解答 :
不同的請求地址會交給路由處理來轉發給相應的控制器處理,所以說路由就可以在轉發前修改轉發地址,你可以在這上面大作文章。
簡單的概括:路由是一個框架,可以控制、轉發對頁面的跳轉,并在跳轉之前做任何你想要的處理。
那么,Android中為何要引入一個Web中才有的路由概念?
如果你用過一些路由框架,比如 Router 、 AndRoute 、 ActivityRouter ,它們和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