前言
隨著公司項(xiàng)目越來越大,人員增多脚祟,項(xiàng)目會(huì)出現(xiàn)難維護(hù)谬以、新人入職后,需要花費(fèi)很多時(shí)間去熟悉項(xiàng)目由桌。最重要的是为黎,每次編譯時(shí)間真的太久了!P心铭乾!為了解決這個(gè)問題,項(xiàng)目重構(gòu)娃循、模塊化需要提上日程炕檩。項(xiàng)目拆分成模塊之后,頁面的跳轉(zhuǎn)就不能直接startActivity 調(diào)用具體的activity了淮野,因?yàn)檫@個(gè)Activity已經(jīng)在另外一個(gè)模塊中捧书,直接用顯示引用是提示不出來的,這時(shí)需要通過借助路由庫(kù)來實(shí)現(xiàn)頁面的跳轉(zhuǎn)骤星,當(dāng)然通過反射的方式也是可以跳轉(zhuǎn)到對(duì)應(yīng)頁面的经瓷。通過這樣的路由跳轉(zhuǎn),而不是顯示引用洞难,就達(dá)到了模塊之間解耦的目的舆吮,在不需要的時(shí)候,可以不需要引入這個(gè)模塊編譯队贱,提高開發(fā)速度色冀,發(fā)布的時(shí)候又能很方便的集成進(jìn)來,功能不受影響柱嫌,這就實(shí)現(xiàn)了模塊化的第一步锋恬。路由框架推薦使用阿里開源的ARouter路由框架,畢竟是大廠開源的框架编丘,穩(wěn)定性与学、可靠性也相對(duì)較高彤悔。
ARouter框架介紹
ARouter框架地址
- 支持直接解析標(biāo)準(zhǔn)URL進(jìn)行跳轉(zhuǎn),并自動(dòng)注入?yún)?shù)到目標(biāo)頁面中
- 支持多模塊工程使用
- 支持添加多個(gè)攔截器索守,自定義攔截順序
- 支持依賴注入晕窑,可單獨(dú)作為依賴注入框架使用
- 支持InstantRun
- 支持MultiDex(Google方案)
- 映射關(guān)系按組分類、多級(jí)管理卵佛,按需初始化
- 支持用戶指定全局降級(jí)與局部降級(jí)策略
- 頁面杨赤、攔截器、服務(wù)等組件均自動(dòng)注冊(cè)到框架
- 支持多種方式配置轉(zhuǎn)場(chǎng)動(dòng)畫
- 支持獲取Fragment
- 完全支持Kotlin以及混編
- 支持第三方 App 加固(使用 arouter-register 實(shí)現(xiàn)自動(dòng)注冊(cè))
基礎(chǔ)使用
- 添加依賴和配置
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
}
dependencies {
// 替換成最新版本, 需要注意的是api
// 要與compiler匹配使用截汪,均使用最新版可以保證兼容
compile 'com.alibaba:arouter-api:x.x.x'
annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
...
}
- 添加注解
// 在支持路由的頁面上添加注解(必選)
// 這里的路徑需要注意的是至少需要有兩級(jí)疾牲,/xx/xx
@Route(path = "/test/activity")
public class YourActivity extend Activity {
...
}
路由路徑,我們可以封裝一個(gè)RouterManger
工具類放在moudle_base
模塊中挫鸽,統(tǒng)一管理整個(gè)項(xiàng)目的 Path
及路由框架的初始化操作, 示例如下:
/**
* @author: xiaohaibin.
* @time: 2018/4/12
* @mail:xhb_199409@163.com
* @github:https://github.com/xiaohaibin
* @describe: 路由框架管理工具類
*/
public class RouterManger {
public static class Path {
public static final String MAIN_TEST_ACTIVITY = "/main/test2";
public static final String USER_LOGIN_ACTIVITY = "/user/login";
public static final String MAIN_NEED_LOGIN_ACTIVITY = "/main/need_login";
}
/**
* 初始化路由框架
* @param application
*/
public static void initRouter(Application application) {
if (BuildConfig.DEBUG) {
// 打印日志
ARouter.openDebug();
// 開啟調(diào)試模式(如果在InstantRun模式下運(yùn)行说敏,必須開啟調(diào)試模式!線上版本需要關(guān)閉,否則有安全風(fēng)險(xiǎn))
ARouter.openLog();
}
ARouter.init(application);
}
}
- 初始化SDK
public class MyApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
//初始化路由框架
RouterManger.initRouter(this);
}
}
- 發(fā)起路由操作
// 1. 應(yīng)用內(nèi)簡(jiǎn)單的跳轉(zhuǎn)
ARouter.getInstance().build("/test/activity").navigation();
// 2. 跳轉(zhuǎn)并攜帶參數(shù)
ARouter.getInstance()
.build(RouterManger.Path.MAIN_TEST_ACTIVITY)
.withString("key", "小豬佩奇身上紋丢郊,掌聲送給社會(huì)人")
.navigation(this);
-
聲明攔截器(攔截跳轉(zhuǎn)過程盔沫,面向切面編程)
這個(gè)是我覺得ARouter框架中比較實(shí)用的功能了。通常我們跳轉(zhuǎn)一個(gè)需要登錄的頁面時(shí)枫匾,每次跳轉(zhuǎn)前都要重復(fù)做登陸檢查〖艿現(xiàn)在我們只需要聲明一個(gè)登錄攔截器,攔截器會(huì)在跳轉(zhuǎn)之間執(zhí)行干茉,多個(gè)攔截器會(huì)按優(yōu)先級(jí)順序依次執(zhí)行谴忧。是不是很Nice!=浅妗沾谓!
/**
* @author: xiaohaibin.
* @time: 2018/4/12
* @mail:xhb_199409@163.com
* @github:https://github.com/xiaohaibin
* @describe: 登錄跳轉(zhuǎn)攔截器
*/
@Interceptor(priority = 8, name = "登錄跳轉(zhuǎn)攔截器")
public class LoginInterceptor implements IInterceptor {
Context mContext;
@Override
public void process(final Postcard postcard, final InterceptorCallback callback) {
if (Constants.NEED_LOGIN == postcard.getExtra()) {
//如果需要再界面展示東西,需要切換到主線程進(jìn)行caoz
MainLooper.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(mContext, "請(qǐng)登錄", Toast.LENGTH_SHORT).show();
ARouter.getInstance().build(RouterManger.Path.USER_LOGIN_ACTIVITY).navigation();
//處理完成戳鹅,交還控制權(quán)
callback.onInterrupt(null);
}
});
} else {
//處理完成均驶,交還控制權(quán)
callback.onContinue(postcard);
}
}
@Override
public void init(Context context) {
mContext = context;
//此處做一些初始化的工作
}
}
- 為目標(biāo)頁面聲明更多信息
我們經(jīng)常需要在目標(biāo)頁面中配置一些屬性,比方說"是否需要登陸"之類的
可以通過 Route 注解中的 extras 屬性進(jìn)行擴(kuò)展枫虏,這個(gè)屬性是一個(gè) int值妇穴,換句話說,單個(gè)int有4字節(jié)隶债,也就是32位腾它,可以配置32個(gè)開關(guān)
剩下的可以自行發(fā)揮,通過字節(jié)操作可以標(biāo)識(shí)32個(gè)開關(guān)死讹,通過開關(guān)標(biāo)記目標(biāo)頁面的一些屬性瞒滴,在攔截器中可以拿到這個(gè)標(biāo)記進(jìn)行業(yè)務(wù)邏輯判斷
/**
* 跳轉(zhuǎn)需要登錄頁面
*/
@Route(path = RouterManger.Path.MAIN_NEED_LOGIN_ACTIVITY,extras = Constants.NEED_LOGIN)
public class NeedLoginActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_need_login);
}
}
ARouter更加詳細(xì)的使用教程可以前往官方GitHub查閱,上述為個(gè)人使用過程中覺得需要記錄下來東西赞警,不足之處妓忍,敬請(qǐng)見諒