ARouter - Android路由框架

ARouter簡介

ARouter是阿里巴巴開源的Android平臺(tái)中對(duì)頁面涡戳、服務(wù)提供路由功能的中間件执解,提倡的是簡單驹吮。它干的活就是負(fù)責(zé)頁面跳轉(zhuǎn)的,看到這就有點(diǎn)納悶贡定,這Android不是有startActivity和startActivityForResult嗎赋访?
它的意義在哪呢?

ARouter的意義

  • 靈活性強(qiáng)
    在一些復(fù)雜的業(yè)務(wù)場景下,很多功能都是動(dòng)態(tài)配置的蚓耽,比如跳轉(zhuǎn)到一個(gè)活動(dòng)頁面渠牲,我們事先并不知道具體的目標(biāo)頁面,但如果事先做好了約定步悠,提前做好頁面映射签杈,便可以自由配置。
  • 解耦
    ARouter可以降低各個(gè)關(guān)聯(lián)頁面之間的耦合性鼎兽,解耦頁面之間的依賴關(guān)系答姥。
  • 簡化代碼
    ARouter它是基于注解實(shí)現(xiàn),使用方便谚咬,你之前的數(shù)行跳轉(zhuǎn)代碼可以精簡成一行代碼
  • 性能優(yōu)良
    ARouter是在編譯期處理注解的鹦付,對(duì)運(yùn)行時(shí)性能沒有影響
  • 支持注解Fragment
    ARouter不僅支持注解Activity,還支持注解Fragment

OK择卦,好處意義講到這里就可以了敲长,趕緊把它引入到項(xiàng)目中吧


集成ARouter

  • 在項(xiàng)目級(jí)的build.gradle中加入依賴:
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        compile 'com.alibaba:arouter-api:1.3.1'  
        annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'  
    }
}

Api 的版本和 compiler 的版本號(hào)需要用最新的。最新的版本在 Github上可以找到秉继。

GitHub查詢最新版本
  • ARouter初始化
    Router需要初始化祈噪,用于初始化路由表,建議放到Application中做:
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        // 打印日志
        ARouter.openLog(); 
        // 開啟調(diào)試模式(如果在InstantRun(就是AndroidStudio2.0以后新增的一個(gè)可以減少很多編譯時(shí)間的運(yùn)行機(jī)制)模式下運(yùn)行尚辑,必須開啟調(diào)試模式辑鲤!線上版本需要關(guān)閉,否則有安全風(fēng)險(xiǎn))
        ARouter.openDebug(); 
        // 初始化盡可能早,推薦在Application中初始化
        ARouter.init(this); 
    }
}

OK杠茬,集成完畢月褥,開始使用!

使用基本ARouter

  • ARouter注解路由
    我們新建一個(gè)TestARouterActivity作為測試 澈蝙,在 TestARouterActivity中添加注解的代碼如下:
// 在支持路由的頁面上添加注解(必須寫)
// 這里的路徑需要注意的是至少需要有兩級(jí)吓坚,/xx/xx撵幽,名字你自己起
@Route(path = "/com/TestARouterActivity")
public class TestARouterActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
    }
}
  • 開始跳轉(zhuǎn)
 //這里的"/com/TestARouterActivity"就是上面的TestARouterActivity添加的路由注解
 ARouter.getInstance().build("/com/TestARouterActivity").navigation();

OK,跳轉(zhuǎn)完成了灯荧,簡單吧,哈哈

再來看一下稍微復(fù)雜一點(diǎn)的跳轉(zhuǎn):startActivityForResult()

這個(gè)就改動(dòng)一處即可盐杂,其他不用變:

navigation(Activity mContext, int requestCode)

把上面的TestARouterActivity用來實(shí)現(xiàn)就是:

ARouter.getInstance().build("/com/TestARouterActivity").navigation(this , 100);

這里補(bǔ)充一點(diǎn)哈逗载,如果你的路徑下的對(duì)不上號(hào),就是你想跳轉(zhuǎn)到的頁面的ARouter注解路由和build(" ")里面的不同链烈,那么ARouter就是Toast提示厉斟,崩潰是不存在的。

再來看一下稍微復(fù)雜一點(diǎn)的跳轉(zhuǎn):頁面?zhèn)髦?/strong>
ARouter里面提供了豐富大量的參數(shù)類型强衡,供我們選擇

//基礎(chǔ)類型
.withString( String key, String value )
.withBoolean( String key, boolean value)
.withChar( String key, char value )
.withShort( String key, short value)
.withInt( String key, int value)
.withLong( String key, long value)
.withDouble( String key, double value)
.withByte( String key, byte value)
.withFloat( String key, float value)
.withCharSequence( String key,  CharSequence value)

//數(shù)組類型
.withParcelableArrayList( String key, ArrayList<? extends Parcelable > value)
.withStringArrayList( String key,  ArrayList<String> value)
.withIntegerArrayList( String key, ArrayList<Integer> value)
.withSparseParcelableArray( String key, SparseArray<? extends Parcelable> value)
.withCharSequenceArrayList( String key, ArrayList<CharSequence> value)
.withShortArray( String key,  short[] value)
.withCharArray( String key, char[] value)
.withFloatArray( String key, float[] value)
.withCharSequenceArray( String key,  CharSequence[] value)

//Bundle 類型
.with( Bundle bundle )

//Activity 跳轉(zhuǎn)動(dòng)畫
.withTransition(int enterAnim, int exitAnim)

//其他類型
.withParcelable( String key, Parcelable value)
.withParcelableArray( String key,  Parcelable[] value)
.withSerializable( String key, Serializable value)
.withByteArray( String key, byte[] value)
.withTransition(int enterAnim, int exitAnim)

比如我想給TestARouterActivity傳遞一個(gè)“哈哈哈”, key = "aaa", value = "哈哈哈"擦秽,直接上代碼:

ARouter.getInstance()
        .build("/com/TestARouterActivity")
        .withString("aaa", "哈哈哈") 
        .navigation();

而我們只需要在TestARouterActivity 類里面注解一下獲取:

@Route(path = "/com/TestARouterActivity")
public class TestARouterActivity extends AppCompatActivity {

    @Autowired(name = "aaa")
    public String mTestVaule;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
    }
}

OK,到這里感挥,我們平時(shí)用到的Activity之間跳轉(zhuǎn)的基本功能差不多都實(shí)現(xiàn)了缩搅,再來看點(diǎn)進(jìn)階的:

使用進(jìn)階ARouter

  • 監(jiān)聽ARouter過程
    在路由跳轉(zhuǎn)的過程中,我們可以監(jiān)聽路由的過程触幼,來觀察我們的跳轉(zhuǎn)是成功了還是失敗了硼瓣。
navigation(Context context, NavigationCallback callback)

NavigationCallback看名字就是到是個(gè)回調(diào),我們就是通過它來知道跳轉(zhuǎn)的結(jié)果怎么樣了置谦。NavigationCallback 的源碼如下:

public interface NavigationCallback {

    /**
     * Callback when find the destination.
     * 找到了
     * @param postcard meta
     */
    void onFound(Postcard postcard);

    /**
     * Callback after lose your way.
     * 找不到了
     * @param postcard meta
     */
    void onLost(Postcard postcard);

    /**
     * Callback after navigation.
     * 跳轉(zhuǎn)完了
     * @param postcard meta
     */
    void onArrival(Postcard postcard);

    /**
     * Callback on interrupt.
     * 被攔截了
     * @param postcard meta
     */
    void onInterrupt(Postcard postcard);
}

簡單易用:

ARouter.getInstance()
       .build("/com/TestARouterActivity")
       .navigation(this, new NavCallback() {

             @Override
              public void onFound(Postcard postcard) {
                   Log.e("eeeee", "找到TestARouterActivity堂鲤!");
              }

             @Override
              public void onLost(Postcard postcard) {
                   Log.e("eeeee", 找不到TestARouterActivity!");
              }

             @Override
              public void onArrival(Postcard postcard) {
                   Log.e("eeeee", "TestARouterActivity跳轉(zhuǎn)完了媒峡!");
              }

             @Override
              public void onInterrupt(Postcard postcard) {
                    Log.e("eeeee", "TestARouterActivity被攔截了瘟栖!");
              }
              });
  • ARouter的分組
    現(xiàn)在去看下我們之前怎么注解的TestARouterActivity的路由
@Route(path = "/com/TestARouterActivity")

解析一下這個(gè)path:
在path這個(gè)字符串里面,”com” 就代表路由分組的標(biāo)識(shí)谅阿,“TestARouterActivity” 代表是TestARouterActivity類的標(biāo)識(shí)慢宗。組的標(biāo)識(shí)和類的標(biāo)識(shí)都可以自己定義的,需要記住的是組標(biāo)識(shí)和類標(biāo)識(shí)之間用斜杠來區(qū)分 ”\”

那什么是組呢奔穿?
ARouter框架是分組管理镜沽,按需加載
解釋起來就是,在程序的編譯期ARouter掃描了所有的注冊(cè)頁面贱田、服務(wù)缅茉、字段、攔截器...男摧,那么在程序的運(yùn)行期就不能一股腦全部加載進(jìn)來蔬墩,這樣就會(huì)一次性加載太多東西。所以ARouter就用分組來管理耗拓。
ARouter在初始化的時(shí)候只會(huì)一次性地加載所有的Root結(jié)點(diǎn)拇颅,而不會(huì)加載任何一個(gè)Group結(jié)點(diǎn),這樣就會(huì)極大地降低初始化時(shí)加載結(jié)點(diǎn)的數(shù)量乔询。
通俗點(diǎn)說吧樟插,比如你把TestARouterActivity1,TestARouterActivity2,TestARouterActivity3分成一組(分組的標(biāo)識(shí)是一樣的)竿刁,組名比如叫"com"黄锤。ARouter初始化的時(shí)候不會(huì)加載"com"這個(gè)Group結(jié)點(diǎn),一旦你需要跳到TestARouterActivity3這個(gè)頁面了食拜,那么ARouter才會(huì)再將com這個(gè)組加載進(jìn)來鸵熟。

  • ARouter的自定義分組
    ARouter的分組可以自定義,我們創(chuàng)建一個(gè)TestARouterActivity2并且添加 ARouter注解负甸,指定它的自定義路由分組流强。如下所示:
@Route(path = "/com/TestARouterActivity2" , group = "testGroup")
public class TestARouterActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_group);
    }
}

上面代碼中的"testGroup"就是TestARouterActivity2的自定義分組痹届,如果我們不指定group字段,那么TestARouterActivity2的默認(rèn)分組就是 "/ /"中間的"com"打月。我們可以代碼驗(yàn)證一下:

@Route(path = "/com/TestARouterActivity2")
public class TestARouterActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_group);
    }
}

····

ARouter.getInstance()
       .build("/com/TestARouterActivity2")
       .navigation(this, new NavCallback() {
            @Override
            public void onArrival(Postcard postcard) {
                Log.e("eeeee", "默認(rèn)分組: " + postcard.getGroup());
            }
        });

上面代碼打印的結(jié)果就是 默認(rèn)分組:com
自定義分組我們?cè)趺刺D(zhuǎn)呢短纵?
很簡單,自定義分組僵控,發(fā)起路由:第二個(gè)參數(shù)就是路由的分組

build(String path, String group);

····

ARouter.getInstance().build("/com/TestARouterActivity2", "testGroup").navigation();
  • 關(guān)閉ARouter
    借用文檔上的說明:關(guān)閉路由香到,這個(gè)操作慎用
ARouter.getInstance().destroy();

ARouter - Fragment

在Fragment中使用ARouter,和Activity中使用沒多少差別
首先报破,創(chuàng)建 Fragment 類悠就,并且添加路由注解

@Route(path = "/com/TestARouterFragment")
public class TestARouterFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_test, container, false);
        return view;
    }
}

然后,獲取你的TestARouterFragment實(shí)例:

TestARouterFragment fragment = (TestARouterFragment)ARouter.getInstance().build( "/com/TestARouterFragment" ).navigation();

拿到了你的Fragment充易,然后該咋用就咋用

ARouter的混淆說明

-keep public class com.alibaba.android.arouter.routes.**{*;}
-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}

Ok梗脾,完事~

總結(jié)一下,ARouter是阿里巴巴開源出來的一款A(yù)ndroid路由框架盹靴,使用起來很簡單炸茧,沒啥干貨可以講,這是它的地址
GitHub:https://github.com/alibaba/ARouter

感謝下面兩篇博文:(兩篇文章就能把它吃的透透的)
尤其第一篇稿静,講的簡單易懂梭冠,這篇文章基本就是摘抄的原創(chuàng)了,加了點(diǎn)點(diǎn)我自己使用過程中的理解改备。我覺得自己能寫下來可以漲不少見識(shí)控漠,也能加深自己的理解

Android 路由框架ARouter最佳實(shí)踐
談android組件化之ARouter簡單使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市悬钳,隨后出現(xiàn)的幾起案子盐捷,更是在濱河造成了極大的恐慌,老刑警劉巖默勾,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碉渡,死亡現(xiàn)場離奇詭異,居然都是意外死亡母剥,警方通過查閱死者的電腦和手機(jī)滞诺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媳搪,“玉大人铭段,你說我怎么就攤上這事骤宣∏乇” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵憔披,是天一觀的道長等限。 經(jīng)常有香客問我爸吮,道長,這世上最難降的妖魔是什么望门? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任形娇,我火速辦了婚禮,結(jié)果婚禮上筹误,老公的妹妹穿的比我還像新娘桐早。我一直安慰自己,他們只是感情好厨剪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布哄酝。 她就那樣靜靜地躺著,像睡著了一般祷膳。 火紅的嫁衣襯著肌膚如雪陶衅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天直晨,我揣著相機(jī)與錄音搀军,去河邊找鬼。 笑死勇皇,一個(gè)胖子當(dāng)著我的面吹牛罩句,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敛摘,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼的止,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了着撩?” 一聲冷哼從身側(cè)響起诅福,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拖叙,沒想到半個(gè)月后氓润,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡薯鳍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年咖气,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挖滤。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡崩溪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斩松,到底是詐尸還是另有隱情伶唯,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布惧盹,位于F島的核電站乳幸,受9級(jí)特大地震影響瞪讼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜粹断,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一符欠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓶埋,春花似錦希柿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至闽颇,卻和暖如春盾戴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兵多。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國打工尖啡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剩膘。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓衅斩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親怠褐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子畏梆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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