从MVVM架构中的ViewModel启动Activity的最佳方法

时间:2018-03-15 05:32:28

标签: android mvvm android-viewmodel android-mvvm

我在应用程序中关注MMVM架构,一切正常,直到我使用以下代码从ViewModel启动活动时崩溃。使用数据绑定从XML调用方法,并将view作为参数传递,getApplication()是来自AndroidViewModel类的方法。

getApplication().startActivity(new Intent(view.getContext(), MyActivity.class));

我相信这是因为我没有使用NEW_TASK标志,因为我在Activity类之外开始活动。

现在我可以想到以下解决方案,但不确定哪种解决方案最好基于架构观点。

1。 ViewModel,其方法以Activity为参数并从片段中调用该方法

public startMyActivity(Activity activity){
   activity.startActivity(new Intent(activity, MyActivity.class));
}

现在在片段

中添加类似这样的列表器
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从view xml调用方法?

我不确定第二种方法是否会在某些操作系统中使应用程序崩溃。

从架构的角度和单元测试的角度来看哪一个是最好的方法?

1 个答案:

答案 0 :(得分:6)

我会去活动/片段内导航,但当然大多数情况下你想从视图模型触发导航。 因此,您需要使用查看模型中的命令来通知您的视图(活动/片段)以在其他位置导航。 你可以做这种"命令"使用LiveData,更具体地说是SingleLiveEvent

SingleLiveEvent就像任何LiveData一样,但只有当您明确为其设置值时才会触发事件,例如,当您从视图(活动/片段)开始观察时,您将无法获得其值