Android 模塊之旅:ARoutrer框架使用教程

前言

隨著公司項目越來越大,人員增多,項目會出現(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框架地址
  1. 支持直接解析標(biāo)準URL進行跳轉(zhuǎn),并自動注入?yún)?shù)到目標(biāo)頁面中
  2. 支持多模塊工程使用
  3. 支持添加多個攔截器,自定義攔截順序
  4. 支持依賴注入,可單獨作為依賴注入框架使用
  5. 支持InstantRun
  6. 支持MultiDex(Google方案)
  7. 映射關(guān)系按組分類、多級管理,按需初始化
  8. 支持用戶指定全局降級與局部降級策略
  9. 頁面、攔截器、服務(wù)等組件均自動注冊到框架
  10. 支持多種方式配置轉(zhuǎn)場動畫
  11. 支持獲取Fragment
  12. 完全支持Kotlin以及混編
  13. 支持第三方 App 加固(使用 arouter-register 實現(xiàn)自動注冊)

基礎(chǔ)使用

  1. 添加依賴和配置
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'
    ...
}
  1. 添加注解
// 在支持路由的頁面上添加注解(必選)
// 這里的路徑需要注意的是至少需要有兩級,/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);
    }
}

  1. 初始化SDK
public class MyApplication extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        //初始化路由框架
        RouterManger.initRouter(this);
    }
}
  1. 發(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);
  1. 聲明攔截器(攔截跳轉(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;
        //此處做一些初始化的工作
    }
}
  1. 為目標(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查閱,上述為個人使用過程中覺得需要記錄下來東西,不足之處,敬請見諒

ARouterDemo地址
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容