我在应用中采用了MVVM架构,一切都很好,直到我使用以下代码从ViewModel启动Activity时发生崩溃。该方法是通过数据绑定从XML调用的,并传递view
作为参数,getApplication()
是AndroidViewModel
类的方法。
getApplication().startActivity(new Intent(view.getContext(), MyActivity.class));
我认为这是因为我在Activity类外启动活动时没有使用NEW_TASK标志。
现在有以下解决方案,但不确定哪个从架构角度来看最好。
1. ViewModel带有一个以Activity作为参数的方法,并从片段调用该方法。
public startMyActivity(Activity activity){
activity.startActivity(new Intent(activity, MyActivity.class));
}
现在在fragment中添加一个类似以下的监听器:
mBinding.myButton.setOnClickListener(){
viewModel.startMyActivity(getActivity());
}
2. 向意图添加新的任务标志并将其保留在ViewModel中
Intent myIntent = new Intent(view.getContext(), MyActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
getApplication().startActivity(myIntent);
3.从片段自身启动活动
mBinding.myButton.setOnClickListener(){
activity.startActivity(new Intent(activity, MyActivity.class));
}
我相信所有这些方法都可以很好地工作,但脑海中有一个问题:在Fragment中单独使用侦听器而不是使用绑定的ViewModel从视图xml调用方法是否可以?从架构角度和单元测试的角度来看,哪种方法是最好的?我对第二种方法还不确定,在某些操作系统中是否仍会导致应用程序崩溃。
NEW_TASK
。例如,在广播接收器或服务中没有可用的活动上下文。 - Muhammad Babar