前言
隨著公司項目越來越大,人員增多,項目會出現(xiàn)難維護、新人入職后,需要花費很多時間去熟悉項目。最重要的是,每次編譯時間真的太久了!??!為了解決這個問題,項目重構(gòu)、模塊化需要提上日程。項目拆分成模塊之后,頁面的跳轉(zhuǎn)就不能直接startActivity 調(diào)用具體的activity了,因為這個Activity已經(jīng)在另外一個模塊中,直接用顯示引用是提示不出來的,這時需要通過借助路由庫來實現(xiàn)頁面的跳轉(zhuǎn),當(dāng)然通過反射的方式也是可以跳轉(zhuǎn)到對應(yīng)頁面的。通過這樣的路由跳轉(zhuǎn),而不是顯示引用,就達到了模塊之間解耦的目的,在不需要的時候,可以不需要引入這個模塊編譯,提高開發(fā)速度,發(fā)布的時候又能很方便的集成進來,功能不受影響,這就實現(xiàn)了模塊化的第一步。路由框架推薦使用阿里開源的ARouter路由框架,畢竟是大廠開源的框架,穩(wěn)定性、可靠性也相對較高。
ARouter框架介紹
ARouter框架地址
- 支持直接解析標(biāo)準URL進行跳轉(zhuǎn),并自動注入?yún)?shù)到目標(biāo)頁面中
- 支持多模塊工程使用
- 支持添加多個攔截器,自定義攔截順序
- 支持依賴注入,可單獨作為依賴注入框架使用
- 支持InstantRun
- 支持MultiDex(Google方案)
- 映射關(guān)系按組分類、多級管理,按需初始化
- 支持用戶指定全局降級與局部降級策略
- 頁面、攔截器、服務(wù)等組件均自動注冊到框架
- 支持多種方式配置轉(zhuǎn)場動畫
- 支持獲取Fragment
- 完全支持Kotlin以及混編
- 支持第三方 App 加固(使用 arouter-register 實現(xiàn)自動注冊)
基礎(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'
...
}
- 添加注解
// 在支持路由的頁面上添加注解(必選)
// 這里的路徑需要注意的是至少需要有兩級,/xx/xx
@Route(path = "/test/activity")
public class YourActivity extend Activity {
...
}
路由路徑,我們可以封裝一個RouterManger工具類放在moudle_base模塊中,統(tǒ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模式下運行,必須開啟調(diào)試模式!線上版本需要關(guān)閉,否則有安全風(fēng)險)
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)簡單的跳轉(zhuǎn)
ARouter.getInstance().build("/test/activity").navigation();
// 2. 跳轉(zhuǎn)并攜帶參數(shù)
ARouter.getInstance()
.build(RouterManger.Path.MAIN_TEST_ACTIVITY)
.withString("key", "小豬佩奇身上紋,掌聲送給社會人")
.navigation(this);
-
聲明攔截器(攔截跳轉(zhuǎn)過程,面向切面編程)
這個是我覺得ARouter框架中比較實用的功能了。通常我們跳轉(zhuǎn)一個需要登錄的頁面時,每次跳轉(zhuǎn)前都要重復(fù)做登陸檢查?,F(xiàn)在我們只需要聲明一個登錄攔截器,攔截器會在跳轉(zhuǎn)之間執(zhí)行,多個攔截器會按優(yōu)先級順序依次執(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()) {
//如果需要再界面展示東西,需要切換到主線程進行caoz
MainLooper.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(mContext, "請登錄", 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 屬性進行擴展,這個屬性是一個 int值,換句話說,單個int有4字節(jié),也就是32位,可以配置32個開關(guān)
剩下的可以自行發(fā)揮,通過字節(jié)操作可以標(biāo)識32個開關(guān),通過開關(guān)標(biāo)記目標(biāo)頁面的一些屬性,在攔截器中可以拿到這個標(biāo)記進行業(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更加詳細的使用教程可以前往官方GitHub查閱,上述為個人使用過程中覺得需要記錄下來東西,不足之處,敬請見諒