我正在尝试为以下情况创建一个简洁的解决方案:
我构建了一个需要凭据来验证用户身份的应用。每当API想要重新验证用户时,我都想强制用户返回登录视图。此功能很有用,但当用户按下设备上的后退按钮时,将显示上一个视图。我希望看到当用户按下后退按钮时,应用程序退出。
MvvmCross可以选择使用MvxPresentationHint。我创建了一个CustomAndroidViewPresenter并创建了以下MvxAndroidSetup:
public class Setup : MvxAndroidSetup
{
private CustomAndroidViewPresenter _presenter;
public Setup(Context applicationContext)
: base(applicationContext)
{
_presenter = new CustomAndroidViewPresenter(applicationContext);
}
protected override IMvxAndroidViewPresenter CreateViewPresenter()
{
Mvx.RegisterSingleton(_presenter);
return _presenter;
}
}
我知道你应该调用Finish();在一个活动上,以防止后退按钮导航回未经身份验证的视图。但是转换applicationContext会引发异常。
public CustomAndroidViewPresenter(Context context)
{
_context = context;
}
public override void ChangePresentation(MvxPresentationHint hint)
{
if (hint is LoginOnlyBackStackHint)
{
var context = Application.Context;
if (context is Activity)
{
// Context is NOT activity
}
try
{
Activity x = (Activity) context;
x.Finish();
// Exception is thrown
}
catch (Exception ex)
{
}
}
base.ChangePresentation(hint);
}
有人有任何想法如何实现这个目标吗?
非常感谢提前。
答案 0 :(得分:13)
我遇到了同样的问题。只需实现一个自定义Presenter,它设置一些意图标志,如果你想要实现这个:
public class CustomAndroidPresenter : MvxAndroidViewPresenter
{
public override void Show(MvxViewModelRequest request)
{
if (request != null && request.PresentationValues != null)
{
if (request.PresentationValues.ContainsKey("MyCustomFlag"))
{
// Get intent from request and set flags to clear backstack.
var intent = base.CreateIntentForRequest(request);
intent.SetFlags(ActivityFlags.ClearTask | ActivityFlags.NewTask);
base.Show(intent);
return;
}
}
base.Show(request);
}
}
然后您需要在设置类中设置此演示者:
protected override IMvxAndroidViewPresenter CreateViewPresenter()
{
var presenter = new CustomAndroidPresenter();
Mvx.RegisterSingleton<IMvxViewPresenter>(presenter);
return presenter;
}
然后显示一个viewmodel(就像你的登录视图一样)只需设置你的自定义标志键代码,演示者知道他应该设置内容标志:
protected void ShowViewModel<TViewModel>(bool clearbackstack) where TViewModel : MvxViewModel
{
if (clearbackstack)
{
var presentationBundle = new MvxBundle(new Dictionary<string, string> { { "MyCustomFlag", "" } });
ShowViewModel<TViewModel>(presentationBundle: presentationBundle);
return;
}
// Normal start
ShowViewModel<TViewModel>();
}
要显示视图模型(不使用反向导航),只需使用以下代码:
ShowViewModel<MyViewModel>(true);
然后,当您按下后退按钮时,您无法导航回到之前的活动,因为后台堆栈已被清除。
答案 1 :(得分:3)
您可以利用OnStop Activity生命周期方法。
public class LoginActivity : MvxAppCompatActivity<LoginViewModel>
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.activity_login);
}
/// <summary>
/// Removes activity from history after navigating to new activity.
/// </summary>
protected override void OnStop()
{
base.OnStop();
Finish();
}
/// <summary>
/// Closes app if back button is pressed.
/// </summary>
public override void OnBackPressed()
{
if (FragmentManager.BackStackEntryCount > 0)
{
FragmentManager.PopBackStack();
}
else
{
base.OnBackPressed();
}
}
}