參考文獻:java
superxlcr的ARouter學習筆記android
碼字農民工的文章git
繁華落盡666的文章程序員
本文主要介紹的知識點
- 關於android路由框架解決的問題
- android路由框架的使用(這裏只是介紹ARouter的使用)
- 關於使用ARouter框架的注意事項
- 總結
相信你們在工做中都會遇到這樣的問題,經過其餘App或者經過網頁跳轉到指定的本身的App或者跳轉到指定的頁面中去,通常都是在推送中或者經過Banner點擊以後的操做,通常的操做都是像下面這樣的github
<intent-filter>
<action android:name="com.hejin.arouter.Main2Activity"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
複製代碼
Intent intent = new Intent();
intent.setAction("com.hejin.arouter.Main2Activity");
startActivity(intent);
複製代碼
其實這裏我要說明一下,若是你是正規的開發公司我以爲通常都不會這麼去寫,其實這個跳轉徹底能實現,可是通常正規的公司都會定一些協議和端口號,也就是說會添加scheme來指定一些數據的協議部分和path進行匹配,可是隨着時間的推移和團隊的擴大,會慢慢的暴露出不少問題:編程
尤爲是在項目演進的時候都會進行組件化開發,因此這裏網上有不少大神就研究出路由框架這麼一個東西,解決了上面的相應問題,這裏接觸的就是阿里巴巴開源的ARouter在GitHub上已經已經有3.+k的start了,相對來講應該比較穩定,因此讓咱們開始吧!api
defaultConfig {
.......
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
複製代碼
dependencies {
compile 'com.alibaba:arouter-api:x.x.x'
annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
...
}
複製代碼
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //路由須要
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
複製代碼
這句話必定要加上不然根本就跳轉不過去,具體爲何我還真是不知道.... 有了以上的內容就完成了基本的配置,就能夠進行相應的跳轉了...安全
/*初始化路由框架*/
ARouter.init(this);
複製代碼
@Route(path = "XXX/XXX")
複製代碼
這裏面要注意兩點首先這個註解裏面的內容必須是二級菜單,這個在github上面有解釋,其次就是這個註解要寫在Activity的類上邊bash
ARouter.getInstance().build("/XXX/XXX").navigation();
//跳轉中攜帶參數
ARouter.getInstance().build("/XXX/XXX")
.withLong("key", "value")
.withString("key", "value")
.navigation
複製代碼
這裏面的參數要和你要跳轉的Activity註解中的參數保持一致,當你傳遞參數的時候,你直接經過Intent去取就能夠了.app
Uri uri = Uri.parse("/test/activity");
ARouter.getInstance()
.build(uri)
.navigation();
複製代碼
當你傳遞參數的時候你能夠經過Intent取獲取,固然也能夠經過相應的註解進行獲取,就像下面這樣:
@Autowired(name = "xxx")
public String text;
複製代碼
這裏呢要注意,修飾符必須是public而且key值要相互對應.還要在目標的Activtiy中添加**ARouter.getInstance().inject(this);**纔可使用相應的值,不然取值的時候會失敗,可是不會報空指針.
有沒有想過,以前在Activity跳轉的時候可使用overridePendingTransition();,可是如今經過路由跳轉的話,沒有地方取設置動畫了,而後ARouter爲咱們想到了這個問題.
ARouter.getInstance().build(path).withTransition(R.anim_slide_in,R.anim_slide_out);
複製代碼
ActivityOptionsCompat compat = ActivityOptionsCompat.makeScaleUpAnimation(view, view.getWidth() / 2, view.getHeight() / 2, 0, 0);
ARouter.getInstance().build("path").withOptionsCompat(compat).navigation();
複製代碼
ARouter可讓咱們處理跳轉過程的結果,什麼用呢?就是你找到目標以後要進行什麼操做.
ARouter.getInstance().build("/module/jumpTestActivity2").navigation(null,new NavigationCallback() {
@Override
public void onFound(Postcard postcard) {
// 找到目標後進行的操做
}
@Override
public void onLost(Postcard postcard) {
// 找不到目標進行的操做
}
});
複製代碼
補充說明: 在最新api中已是四個方法了!
ARouter.getInstance().build("/test/activity").navigation(this, new NavigationCallback() {
@Override
public void onFound(Postcard postcard) {
//找到隊應的內容的時候
Log.e("done", "onFound: ");
}
@Override
public void onLost(Postcard postcard) {
//沒有找到對應的內容的時候
Log.e("done", "onLost: ");
}
@Override
public void onArrival(Postcard postcard) {
//跳轉成功
Log.e("done", "onArrival: ");
}
@Override
public void onInterrupt(Postcard postcard) {
//攔截操做
Log.e("done", "onInterrupt: ");
}
});
複製代碼
這裏能夠在onLost中去處理"位置頁面"的跳轉結果,好比升級APP之類的話術.
ARouter.getInstance().build("/test/activity").navigation(this,10);
複製代碼
後面那個參數就是請求碼,別的和以前的都同樣.
在ARouter中有個組的概念,什麼意思呢?就是在構建路由請求的時候,能夠指定分組. 其實這個分組原本就是有個你像path=/test/activity test就至關是分組,可是也可使用group進行分組,像下面這段代碼:
@Route(path = "/test/activity", group = "app")
複製代碼
這裏須要強調一下,若是你設置了相應的分組,那麼在進行跳轉的時候,必定要使用ARouter.getInstance().build(path, group)進行跳轉,不然沒法找到相應的跳轉
能夠從新定向你的URL地址
@Route(path = "/test/activity2")
public class PathReplaceServerImp implements PathReplaceService {
@Override
public String forString(String path) {
path = "/test/activity2";
return path;
}
@Override
public Uri forUri(Uri uri) {
return null;
}
@Override
public void init(Context context) {
Log.e("done", "init: 這裏是初始化的時候執行的方法");
}
}
複製代碼
這裏說明一下:上面得path必定要加上一個任意項目中出現得註解便可,若是項目中沒有出現得話會報空指針異常的.經過上面的代碼,就能夠更改項目中跳轉時候的path和URL地址了.
ARouter的攔截器能夠在navigation的過程當中攔截請求,並進行一系列的處理 ,是一種AOP的編程模式(應用場景爲檢查登錄狀態等)要實現攔截器,首先咱們須要實現IInterceptor接口,並使用Interceptor註解標記咱們的攔截器,並傳入priority優先級參數(數字越小,優先級越高),其實攔截器就是實現了一個接口去進行回調的!
public class TestInterceotor implements IInterceptor {
@Override
public void process(Postcard postcard, final InterceptorCallback callback) {
if (postcard.getPath().equals("/test/activity")) {
callback.onContinue(postcard);
} else {
callback.onContinue(postcard);
}
}
@Override
public void init(Context context) {
Log.e("done", "init: 初始化調用");
}
}
複製代碼
這裏說明幾點內容:
上面的內容只是簡單的用到了攔截器,可是理解起來畢竟又一些晦澀,當直接說讓你實現登錄的攔截,你怎麼實現,開始的時候我也以爲簡單,可是當本身寫的時候,我發現這個問題真不是看上去那麼簡單.這裏我先把內容攔截器的代碼都放上,而後我在講解!
ARouter.getInstance().build("/test/activity").navigation(this, new NavCallback() {
@Override
public void onArrival(Postcard postcard) {
}
@Override
public void onInterrupt(Postcard postcard) {
Log.e(TAG, "onInterrupt: 這個方法是攔截器執行以後才執行的");
}
});
複製代碼
@Interceptor(priority = 7)
public class TestInterceotor implements IInterceptor {
@Override
public void process(Postcard postcard, final InterceptorCallback callback) {
if (postcard.getPath().equals("/test/activity")) {
Log.e("done", "process: main2Activity");
if (APP.isLogin) {/*已經登錄*/
callback.onContinue(postcard);
} else {/*沒有登錄*/
ARouter.getInstance().build("/test/activity2")
.withString("name", postcard.getPath()).navigation();
}
Log.e("done", "process: 執行完了");
} else {
Log.e("done", "process: 這個方法何時執行");
callback.onContinue(postcard);
}
}
@Override
public void init(Context context) {
Log.e("done", "init: 初始化調用");
}
}
複製代碼
@Route(path = "/test/activity2")
public class Main3Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
ARouter.getInstance().inject(this);
}
public void click(View view) {
APP.isLogin = true;
ARouter.getInstance().build("/test/activity").navigation();
finish();
}
}
複製代碼
這裏第一次跳轉的時候,因爲攔截器使得沒有登錄的邏輯就跳轉到了登錄頁面,以後我在登錄頁面模擬了一次登錄的操做,而後關閉這個頁面以前,我又從新跳轉了目標頁面,此次因爲已經登錄了,因此會直接繼續執行跳轉了目標頁面.這裏說的挺簡單的,有一個回調我尚未搞清楚,onInterrupt這個回調以後有什麼用,其實這裏也能夠傳入一個字段,而後跳轉的時候直接傳入這個字段,這個字段主要是保存要跳轉的頁面的數據,以後就能直接跳轉了.這樣就解決了耦合的問題.
@Route(path = "/test/activity", extras = 0;/*注意這裏是int類型的參數*/)
複製代碼
說明一下:這個是在目標的Activity頁面添加的額外參數,以後會在攔截器內生效.
其實關於這個框架還有不少問題我沒有理解,可是基本的一些內容都已經講解了,其實接觸這個框架主要是當初看見組件化開發的時候,看到了這個框架,其實在項目中使用也能夠,總體管理了跳轉.寫的挺亂的,感謝你們抽出寶貴時間來閱讀,有什麼不對的地方但願指正.