ARouter

轉(zhuǎn)自搁痛,感謝原作者雨女。怕原文失效,所以內(nèi)容也拷過來了

ARouter簡介

ARouter是阿里巴巴開源的Android平臺中對頁面曙痘、服務提供路由功能的中間件芳悲,提倡的是簡單。它干的活就是負責頁面跳轉(zhuǎn)的边坤,看到這就有點納悶名扛,這Android不是有startActivity和startActivityForResult嗎?
它的意義在哪呢茧痒?

ARouter的意義

  • 靈活性強
    在一些復雜的業(yè)務場景下肮韧,很多功能都是動態(tài)配置的,比如跳轉(zhuǎn)到一個活動頁面旺订,我們事先并不知道具體的目標頁面惹苗,但如果事先做好了約定,提前做好頁面映射耸峭,便可以自由配置。
  • 解耦
    ARouter可以降低各個關聯(lián)頁面之間的耦合性淋纲,解耦頁面之間的依賴關系劳闹。
  • 簡化代碼
    ARouter它是基于注解實現(xiàn),使用方便洽瞬,你之前的數(shù)行跳轉(zhuǎn)代碼可以精簡成一行代碼
  • 性能優(yōu)良
    ARouter是在編譯期處理注解的本涕,對運行時性能沒有影響
  • 支持注解Fragment
    ARouter不僅支持注解Activity,還支持注解Fragment

OK伙窃,好處意義講到這里就可以了菩颖,趕緊把它引入到項目中吧


集成ARouter

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

Api 的版本和 compiler 的版本號需要用最新的。最新的版本在 Github上可以找到为障。

[圖片上傳失敗...(image-20b7a5-1541644404816)]

  • ARouter初始化
    Router需要初始化晦闰,用于初始化路由表放祟,建議放到Application中做:
public class MyApplication extends Application {

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

        // 打印日志
        ARouter.openLog(); 
        // 開啟調(diào)試模式(如果在InstantRun(就是AndroidStudio2.0以后新增的一個可以減少很多編譯時間的運行機制)模式下運行,必須開啟調(diào)試模式呻右!線上版本需要關閉,否則有安全風險)
        ARouter.openDebug(); 
        // 初始化盡可能早跪妥,推薦在Application中初始化
        ARouter.init(this); 
    }
}

OK,集成完畢声滥,開始使用眉撵!

使用基本ARouter

  • ARouter注解路由
    我們新建一個TestARouterActivity作為測試 ,在 TestARouterActivity中添加注解的代碼如下:
// 在支持路由的頁面上添加注解(必須寫)
// 這里的路徑需要注意的是至少需要有兩級落塑,/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)完成了,簡單吧憾赁,哈哈

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

這個就改動一處即可污朽,其他不用變:

navigation(Activity mContext, int requestCode)

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

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

這里補充一點哈,如果你的路徑下的對不上號缠沈,就是你想跳轉(zhuǎn)到的頁面的ARouter注解路由和build(" ")里面的不同膘壶,那么ARouter就是Toast提示,崩潰是不存在的洲愤。

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

//基礎類型
.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)動畫
.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傳遞一個“哈哈哈”, 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亡问,到這里,我們平時用到的Activity之間跳轉(zhuǎn)的基本功能差不多都實現(xiàn)了肛宋,再來看點進階的:

使用進階ARouter

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

NavigationCallback看名字就是到是個回調(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")

解析一下這個path:
在path這個字符串里面待牵,”com” 就代表路由分組的標識,“TestARouterActivity” 代表是TestARouterActivity類的標識喇勋。組的標識和類的標識都可以自己定義的缨该,需要記住的是組標識和類標識之間用斜杠來區(qū)分 ”\”

那什么是組呢?
ARouter框架是分組管理川背,按需加載
解釋起來就是贰拿,在程序的編譯期ARouter掃描了所有的注冊頁面蛤袒、服務、字段壮不、攔截器...汗盘,那么在程序的運行期就不能一股腦全部加載進來,這樣就會一次性加載太多東西询一。所以ARouter就用分組來管理隐孽。
ARouter在初始化的時候只會一次性地加載所有的Root結(jié)點,而不會加載任何一個Group結(jié)點健蕊,這樣就會極大地降低初始化時加載結(jié)點的數(shù)量菱阵。
通俗點說吧,比如你把TestARouterActivity1缩功,TestARouterActivity2,TestARouterActivity3分成一組(分組的標識是一樣的)晴及,組名比如叫"com"。ARouter初始化的時候不會加載"com"這個Group結(jié)點嫡锌,一旦你需要跳到TestARouterActivity3這個頁面了虑稼,那么ARouter才會再將com這個組加載進來。

  • ARouter的自定義分組
    ARouter的分組可以自定義势木,我們創(chuàng)建一個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的默認分組就是 "/ /"中間的"com"。我們可以代碼驗證一下:

@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", "默認分組: " + postcard.getGroup());
            }
        });

上面代碼打印的結(jié)果就是 默認分組:com
自定義分組我們怎么跳轉(zhuǎn)呢甫男?
很簡單且改,自定義分組,發(fā)起路由:第二個參數(shù)就是路由的分組

build(String path, String group);

····

ARouter.getInstance().build("/com/TestARouterActivity2", "testGroup").navigation();

  • 關閉ARouter
    借用文檔上的說明:關閉路由板驳,這個操作慎用
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實例:

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{*;}

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末直砂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子浩习,更是在濱河造成了極大的恐慌静暂,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谱秽,死亡現(xiàn)場離奇詭異洽蛀,居然都是意外死亡摹迷,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門郊供,熙熙樓的掌柜王于貴愁眉苦臉地迎上來峡碉,“玉大人,你說我怎么就攤上這事驮审■昙模” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵疯淫,是天一觀的道長地来。 經(jīng)常有香客問我,道長熙掺,這世上最難降的妖魔是什么未斑? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮币绩,結(jié)果婚禮上蜡秽,老公的妹妹穿的比我還像新娘。我一直安慰自己缆镣,他們只是感情好芽突,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著费就,像睡著了一般诉瓦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上力细,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天睬澡,我揣著相機與錄音,去河邊找鬼眠蚂。 笑死煞聪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的逝慧。 我是一名探鬼主播昔脯,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼笛臣!你這毒婦竟也來了云稚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤沈堡,失蹤者是張志新(化名)和其女友劉穎静陈,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡鲸拥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年拐格,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刑赶。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡捏浊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出撞叨,到底是詐尸還是另有隱情金踪,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布谒所,位于F島的核電站热康,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏劣领。R本人自食惡果不足惜姐军,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尖淘。 院中可真熱鬧奕锌,春花似錦、人聲如沸村生。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趁桃。三九已至辽话,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卫病,已是汗流浹背油啤。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蟀苛,地道東北人益咬。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像帜平,于是被迫代替她去往敵國和親幽告。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

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

  • 組件化 模塊化裆甩、組件化與插件化 在項目發(fā)展到一定程度冗锁,隨著人員的增多,代碼越來越臃腫嗤栓,這時候就必須進行模塊化的拆分...
    silentleaf閱讀 4,953評論 2 12
  • ARouter簡介 ARouter是阿里巴巴開源的Android平臺中對頁面冻河、服務提供路由功能的中間件,提倡的是簡...
    SHERLOCKvv閱讀 4,695評論 0 8
  • 那一場夢好長好長 我看到了夢中的爹娘 還是那么善良還是那么慈祥 但是他們的容顏啊 卻被時光 夢景模糊了貌樣 那一場...
    晴空萬里迎朝霞閱讀 545評論 0 2
  • 啊芋绸! 曾經(jīng), 你我是鐵欄上担敌, 不曾開放的庭花摔敛, 不知何時, 用文字砌成的堡壘全封, 深陷的雕刻在對面的心中马昙。 我這個不...
    顧北清歌暖閱讀 344評論 3 8
  • 醫(yī)生代表了救死扶傷,他們?yōu)橐粋€個絲毫不想干的人刹悴,用盡自己的全力行楞,將他們從死亡線上拉回來。當一名臨床醫(yī)生土匀,其中的艱辛...
    簡duangduang閱讀 540評論 0 0