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

前言

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

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

  1. 初始化SDK
public class MyApplication extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        //初始化路由框架
        RouterManger.initRouter(this);
    }
}
  1. 發(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);
  1. 聲明攔截器(攔截跳轉(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;
        //此處做一些初始化的工作
    }
}
  1. 為目標(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)見諒

ARouterDemo地址
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稀并,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子单默,更是在濱河造成了極大的恐慌,老刑警劉巖忘瓦,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搁廓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡耕皮,警方通過查閱死者的電腦和手機(jī)境蜕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凌停,“玉大人粱年,你說我怎么就攤上這事》D猓” “怎么了台诗?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)赐俗。 經(jīng)常有香客問我拉队,道長(zhǎng),這世上最難降的妖魔是什么阻逮? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任粱快,我火速辦了婚禮,結(jié)果婚禮上叔扼,老公的妹妹穿的比我還像新娘事哭。我一直安慰自己,他們只是感情好瓜富,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布鳍咱。 她就那樣靜靜地躺著,像睡著了一般食呻。 火紅的嫁衣襯著肌膚如雪流炕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天仅胞,我揣著相機(jī)與錄音每辟,去河邊找鬼。 笑死干旧,一個(gè)胖子當(dāng)著我的面吹牛渠欺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播椎眯,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼挠将,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼胳岂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起舔稀,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤乳丰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后内贮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體产园,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年夜郁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了什燕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡竞端,死狀恐怖屎即,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情事富,我是刑警寧澤技俐,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站统台,受9級(jí)特大地震影響虽另,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饺谬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一捂刺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧募寨,春花似錦族展、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至列肢,卻和暖如春恰画,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓷马。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工拴还, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人欧聘。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓片林,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子费封,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容