El botón para impedir que Android vuelva a la vista anterior de Xamarin MvvmCross

Estoy tratando de crear una solución clara para la siguiente situación:

He creado una aplicación que requiere credenciales para autenticar al usuario. Siempre que la API desee volver a autenticar al usuario, deseo forzar al usuario a volver a la vista de inicio de sesión. Esta funcionalidad funciona muy bien, pero cuando el usuario presiona el botón Atrás en el dispositivo, se muestra la vista anterior. Me gustaría ver que cuando el usuario presiona el botón Atrás, la aplicación sale.

MvvmCross tiene la opción de usar MvxPresentationHint . Creé un CustomAndroidViewPresenter y creé el siguiente 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; } } 

Sé que debes llamar a Finish (); en una actividad para evitar que el botón de retroceso vuelva a la vista no autenticada. Pero lanzar el applicationContext para lanzar una excepción.

 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); } 

¿Alguien tiene alguna idea de cómo lograr esto?

Muchas gracias de antemano.

Yo tuve el mismo problema. Solo implementa un Presenter personalizado, que establece algunos indicadores de intención, si quieres lograr esto:

 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); } } 

Entonces necesitas configurar este presentador en tu clase de configuración:

 protected override IMvxAndroidViewPresenter CreateViewPresenter() { var presenter = new CustomAndroidPresenter(); Mvx.RegisterSingleton(presenter); return presenter; } 

Y luego, para mostrar un modelo de vista (como su vista de inicio de sesión) simplemente configure su código de clave de marca personalizado que el presentador sepa que debe configurar las tags de intención:

 protected void ShowViewModel(bool clearbackstack) where TViewModel : MvxViewModel { if (clearbackstack) { var presentationBundle = new MvxBundle(new Dictionary { { "MyCustomFlag", "" } }); ShowViewModel(presentationBundle: presentationBundle); return; } // Normal start ShowViewModel(); } 

Para mostrar un modelo de vista (sin navegación hacia atrás) solo use el siguiente código:

 ShowViewModel(true); 

Y luego, cuando presiona el botón de retroceso, no puede volver a su actividad anterior porque se borra el backstack.

Puede aprovechar el método del ciclo de vida de la actividad de OnStop.

 public class LoginActivity : MvxAppCompatActivity { protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.activity_login); } ///  /// Removes activity from history after navigating to new activity. ///  protected override void OnStop() { base.OnStop(); Finish(); } ///  /// Closes app if back button is pressed. ///  public override void OnBackPressed() { if (FragmentManager.BackStackEntryCount > 0) { FragmentManager.PopBackStack(); } else { base.OnBackPressed(); } } }