一般情況來說,我們做界面跳轉(zhuǎn)直接調(diào)用starActivity方法即可;當(dāng)然你不考慮后續(xù)維護(hù),程序不會多變,你可以一直這么用下去,沒什么大礙;但是我們程序一般維護(hù)到底,直到下線為止;那么就該盡量的對程序做維護(hù)做優(yōu)化了,比如對界面的跳轉(zhuǎn)做優(yōu)化;
路由的概念并不陌生,用它主要有以下一些好處
1,對activity的跳轉(zhuǎn)做統(tǒng)一的管理
2,對跳轉(zhuǎn)的結(jié)果,過程,可控
3,遍歷來至于外部的跳轉(zhuǎn)
4,便于維護(hù)
5,組件化必備
.....
直接看用法,這里使用阿里巴巴的Aroute
一,引入框架
compile 'com.alibaba:arouter-api:1.4.0'
annotationProcessor 'com.alibaba:arouter-compiler:1.2.1'
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
二,配置路由路徑
path為跳轉(zhuǎn)的路由路徑,extras 為攔截策略
@Route(path = "/app/order", extras = ArouteConfig.STRATEGY1)
public class OrderActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_order);
}
}
三,跳轉(zhuǎn)界面
ARouter.getInstance().build("/app/order").navigation()
這種跳法呢最主要的是解決組件化跳轉(zhuǎn)的問題,因?yàn)槎嗄K是找不到類名的;
道然如果不是組件化的程序,也是值得我們一用的
舉個(gè)栗子:
平時(shí)我們跳轉(zhuǎn)界面可能會寫下面的代碼,先檢測是否登錄,才能跳轉(zhuǎn),如果只是一小段這樣的邏輯,隨便怎們寫都無所謂;但是如果有很多重復(fù)的邏輯,比如有很多地方可以調(diào)到訂單界面,那就要寫很多這樣的代碼,有一天邏輯變了或者說不僅要判斷登錄,還要判斷用戶有沒有綁定手機(jī)號,想想就很惡心啊;
boolean isLogin = SharedPreferencesTool.getBoolean(context, "isLogin", false);
if (isLogin) {
callback.onContinue(postcard);
} else {
callback.onInterrupt(new Exception("請先登錄"));
}
那么就可以用到攔截器來解決這個(gè)問題,優(yōu)雅而大方的做到全局的控制
1,為了萬一哪天要組件化,我們最好把路由的跳轉(zhuǎn)拿出來放到基礎(chǔ)包里,哪天組件化了也好進(jìn)行抽離,不要封裝到Activty里面;
鍵入我們先簡單的封裝倆個(gè)統(tǒng)一的跳轉(zhuǎn)方法,一個(gè)帶參數(shù),一個(gè)不帶參數(shù),callBack封裝一個(gè)自己的來處理自己的邏輯
/**
* 不帶參數(shù)跳轉(zhuǎn)
* @param context
* @param path
*/
public static void toActivity(final Context context, String path) {
ARouter.getInstance().build(path).navigation(context, new MyNavigationCallback(context));
}
/**
* 帶參數(shù)跳轉(zhuǎn)
* @param context
* @param path
* @param bundle
*/
public static void toActivity(final Context context, String path, Bundle bundle) {
ARouter.getInstance().build(path)
.withBundle("data", bundle).navigation(context, new MyNavigationCallback(context));
}
NavigationCallback
public class MyNavigationCallback implements NavigationCallback {
private Context context;
public MyNavigationCallback(Context context) {
this.context = context;
}
@Override
public void onFound(Postcard postcard) {
}
@Override
public void onLost(Postcard postcard) {
}
@Override
public void onArrival(Postcard postcard) {
}
@Override
public void onInterrupt(final Postcard postcard) {
//假設(shè)值處理onInterrupt方法,這里只把為什么被攔截的信息打出來
new Handler(context.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Toast.makeText(context, (String) postcard.getTag(), Toast.LENGTH_SHORT).show();
}
});
}
}
二,然后的定義一組攔截的策略,因?yàn)樗@里定義的攔截器是全局的,如果你不定義策略做處理,進(jìn)本所有的界面都會被攔截
假設(shè)我們只定義一個(gè)策略
public interface ArouteConfig {
int STRATEGY1 = 1;//攔截登錄
}
三,那么就可以開始寫一個(gè)攔截器了
在攔截器中我們對所有的策略做一個(gè)處理,根據(jù)每個(gè)策略的具體做法,比如策略1我們只攔截登錄,那么就要在登錄里判斷,如果是策略1就去做處理;比如在策略2中我們攔截登錄和綁定手機(jī)號,那么在登錄中判斷如果是策略2也要做處理,在手機(jī)號攔截中也要判斷,整個(gè)攔截器的機(jī)制其實(shí)和okhttp的機(jī)制很像,是根據(jù)攔截的級別去鏈?zhǔn)秸{(diào)用的
@Interceptor(priority = 1, name = "loginInterceptor")
public class OrderInterceptor implements IInterceptor {
private Context context;
@Override
public void process(Postcard postcard, InterceptorCallback callback) {
int extra = postcard.getExtra();
switch (extra) {
//攔截登錄
case ArouteConfig.STRATEGY1:
boolean isLogin = SharedPreferencesTool.getBoolean(context, "isLogin", false);
if (isLogin) {
callback.onContinue(postcard);
} else {
callback.onInterrupt(new Exception("請先登錄"));
}
break;
//什么都不攔截
default:
callback.onContinue(postcard);
break;
}
}
@Override
public void init(Context context) {
this.context = context;
}
}
上面便是登錄的攔截器,看到在策略1中去做判斷,其他的神們都不管.
四,配置Activity的攔截策略
如果不需要進(jìn)行攔截extras 就不需要配置了
@Route(path = "/app/order", extras = ArouteConfig.STRATEGY1)
public class OrderActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_order);
}
}
以上就是路由的有個(gè)大體用法,當(dāng)然還有很多方便的東西,比如全局的降級,外部scheme的處理等等...總之該徹底拋棄系統(tǒng)的跳轉(zhuǎn)方法了;