一般情况来说,我们做界面跳转直接调用starActivity方法即可;当然你不考虑后续维护,程序不会多变,你可以一直这么用下去,没什么大碍;但是我们程序一般维护到底,直到下线为止;那么就该尽量的对程序做维护做优化了,比如对界面的跳转做优化;
路由的概念并不陌生,用它主要有以下一些好处
1,对activity的跳转做统一的管理
2,对跳转的结果,过程,可控
3,遍历来至于外部的跳转
4,便于维护
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为跳转的路由路径,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);
}
}
三,跳转界面
ARouter.getInstance().build("/app/order").navigation()
这种跳法呢最主要的是解决组件化跳转的问题,因为多模块是找不到类名的;
道然如果不是组件化的程序,也是值得我们一用的
举个栗子:
平时我们跳转界面可能会写下面的代码,先检测是否登录,才能跳转,如果只是一小段这样的逻辑,随便怎们写都无所谓;但是如果有很多重复的逻辑,比如有很多地方可以调到订单界面,那就要写很多这样的代码,有一天逻辑变了或者说不仅要判断登录,还要判断用户有没有绑定手机号,想想就很恶心啊;
boolean isLogin = SharedPreferencesTool.getBoolean(context, "isLogin", false);
if (isLogin) {
callback.onContinue(postcard);
} else {
callback.onInterrupt(new Exception("请先登录"));
}
那么就可以用到拦截器来解决这个问题,优雅而大方的做到全局的控制
1,为了万一哪天要组件化,我们最好把路由的跳转拿出来放到基础包里,哪天组件化了也好进行抽离,不要封装到Activty里面;
键入我们先简单的封装俩个统一的跳转方法,一个带参数,一个不带参数,callBack封装一个自己的来处理自己的逻辑
/**
* 不带参数跳转
* @param context
* @param path
*/
public static void toActivity(final Context context, String path) {
ARouter.getInstance().build(path).navigation(context, new MyNavigationCallback(context));
}
/**
* 带参数跳转
* @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) {
//假设值处理onInterrupt方法,这里只把为什么被拦截的信息打出来
new Handler(context.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Toast.makeText(context, (String) postcard.getTag(), Toast.LENGTH_SHORT).show();
}
});
}
}
二,然后的定义一组拦截的策略,因为它这里定义的拦截器是全局的,如果你不定义策略做处理,进本所有的界面都会被拦截
假设我们只定义一个策略
public interface ArouteConfig {
int STRATEGY1 = 1;//拦截登录
}
三,那么就可以开始写一个拦截器了
在拦截器中我们对所有的策略做一个处理,根据每个策略的具体做法,比如策略1我们只拦截登录,那么就要在登录里判断,如果是策略1就去做处理;比如在策略2中我们拦截登录和绑定手机号,那么在登录中判断如果是策略2也要做处理,在手机号拦截中也要判断,整个拦截器的机制其实和okhttp的机制很像,是根据拦截的级别去链式调用的
@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的拦截策略
如果不需要进行拦截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);
}
}
以上就是路由的有个大体用法,当然还有很多方便的东西,比如全局的降级,外部scheme的处理等等…总之该彻底抛弃系统的跳转方法了;