猫眼自动注入化的跳转参数解析方式

猫眼的页面跳转参数解析旧方式

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做的功能更丰富一些,大家可以参考一下。

你可能感兴趣的:(猫眼自动注入化的跳转参数解析方式)