meituan/WMRouter

DefaultActivityLauncher,168行,context为application的时候,会崩溃

memoryjs opened this issue · 5 comments

如题,
if (requestCode != null && context instanceof Activity) {
ActivityCompat.startActivityForResult((Activity) context, intent, requestCode,
options);
} else {
ActivityCompat.startActivity(context, intent, options);
}

如果 requeCode is null,而context是Application的,会崩溃,集成代码中已经出现了这种情况

是否可以根据判断如果context是 application的,价格 new_task_flag以保证正常启动

是否可以根据判断如果context是 application的,价格 new_task_flag以保证正常启动

理论上框架不应该帮你做这么的事情,因为一个 Context 是不是 Activity 应该你自己最清楚,所以应该是让框架提供出能添加 flag 的方法.另外框架遇到这种框架会奔溃确实不应该.因为既然做成了框架,那么框架遇到这些错误的时候都应该能 hold 住,可以回调给用户或者以其他方式告知用户,而不是奔溃。。。

关键他前面判断了,后面就不判断了,这是问题,他本来的逻辑应该是不是Activity的Context就不做处理的,没想到会有一个 requestCode这个
if(!context instanceof Activity){
return;
}
if (requestCode != null ) {
ActivityCompat.startActivityForResult((Activity) context, intent, requestCode,
options);
} else {
ActivityCompat.startActivity(context, intent, options);
}

他应该原来是想写这个逻辑的

关键他前面判断了,后面就不判断了,这是问题,他本来的逻辑应该是不是Activity的Context就不做处理的,没想到会有一个 requestCode这个
if(!context instanceof Activity){
return;
}
if (requestCode != null ) {
ActivityCompat.startActivityForResult((Activity) context, intent, requestCode,
options);
} else {
ActivityCompat.startActivity(context, intent, options);
}

他应该原来是想写这个逻辑的

你可以看一下这个 Component,比较完善,而且功能强大.可以比较选择以下

因为只有Activity才有startActivityForResult方法,其他类型的Context只有startActivity方法,所以有这个判断逻辑。其他类型的Context包括Application、Service等,可以在调用Router时按实际需要自行添加Flag。

如果希望对非Activity的Context自动添加FLAG_ACTIVITY_NEW_TASK,可以在项目中初始化的地方覆写DefaultActivityLauncher。

class CustomActivityLauncher extends DefaultActivityLauncher {
    public int startActivity(...) {
        if (!(request.getContext() instanceof Activity)) {
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
        super.startActivity(request, intent);
    }
}
RouterComponents.setActivityLauncher(new CustomActivityLauncher());