猫眼的页面跳转参数解析旧方式
onCreate()中需要写繁琐的重复代码
之前,我们需要在activity的onCreate()中,把页面跳转传递的参数,解析出来。外界传递来的参数可能在intent的bundle里面,也有可能在intent的uri中(隐式跳转)。
因此为了得到跳转的参数,我们需要类似这么做:
int value = 0;
if(intent!=null){
value = intent.getIntExtra(name,defaultValue);
}
if(value == 0 && intent.getData() != null){
//从uri中获取
Uri uri = intent.getData();
try {
intExtra = Integer.parseInt(uri.getQueryParameter(paramName));
} catch (Exception e) {
//解析错误,即参数不合法
//handleUnValidParam() 比如降级处理,跳转到一个兜底页面
}
}
解析每一个参数都要做一次上面的流程,很繁琐。维护也有一些成本。
主参数的处理
有这么一种场景,我们一个页面需要一个movieId作为主参数,如果页面跳转没有这个参数,那么需要降级处理,跳转到兜底页面,或者主页面。如果传来的参数中有主参数,但是没有其他非必须参数。那么不需要降级处理,其他非必须参数给默认值就可以了,页面正常跳转。
这样一种场景,之前在猫眼并没有做。
猫眼的页面跳转参数解析新方式:自动注入
只需要在Activity中使用CheckAndInjectJumpParam 注解 参数对应的成员变量即可,在Activity onCreate()执行之前,会自动把跳转参数注入进来。不论跳转的形式是普通显示跳转还是隐式跳转。如果参数不合法,那么会自动进行降级处理:跳转到兜底页面;如果主参数不存在,也会进行降级处理。
public class xxxActivity{
@CheckAndInjectJumpParam(keyParam = true)
private long id;
@CheckAndInjectJumpParam
private String nm;
@CheckAndInjectJumpParam
private String enName;
@CheckAndInjectJumpParam
private boolean needRate;
protect void onCreate(Bundle bundle){
super.onCreate(bundle);
...//直接使用id、enName..
}
}
不需要在onCreate()中手写 参数的解析,或者进行解析失败的兜底处理工作。
大致原理
使用aop在Activity onCreate()执行之前,进行页面跳转参数的解析工作。如果解析失败/或不含有主参数,那么会进行异常处理(目前是finish掉当前页面,然后启动兜底页面)。注意,finish掉当前页面时,需要调用当前页面activty的系统onCreate()方法,不然会报SuperNotCalledException。
因为这些工作是在onCreate()方法执行之前完成的,所以出现异常时,不会进行任何业务代码的生命周期的回调(除onDestroy)。所以也就不会产生页面含有的业务fragment等。
todo
需要继续完成的工作是:把activity onCreate()中之前旧的参数解析方式换成新的自动注入化的跳转参数解析方式。
具体代码因为涉及到公司的要求,就不外放了,其实不难,使用aspectj 的Around拦截一下onCreate()就好了。阿里的Arouter做的功能更丰富一些,大家可以参考一下。