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