Xamarin MvvmCross:iOS如何监控应用程序已经转移到前台/后台



我有一个MvvmCross应用程序,我正在使用MvvmmCross ViewModel Lifecycle功能来实现当视图出现、移动到背景和移动到前景时的某些操作:

  • 公共重写异步void ViewAppeared((
  • 公共重写异步void ViewAppearing((
  • 公共重写void ViewDisappearing((
  • 公共重写void ViewDisappeared((
  • 公共重写void ViewDestroy(bool viewFinishing(

这些功能在我的Android设备中运行良好。但对于iOS,当应用程序移动到后台或前台时,它们不会被解雇(尽管,除了ViewDestroy,它们在iOS应用程序的屏幕之间导航时会触发(

1( 这是故意的行为,还是我错过了什么?

2( 如果是这样的话,当应用程序移动到前台/后台时,我们需要采取哪些行动(如停止计时器(,我们必须遵循什么方法?我们是否应该有两个实现——一个用于android,一个用于ios?我还在MvxBaseViewController中尝试了ViewDidDisappear方法,当应用程序移动到后台时,它仍然没有被激活。Xamarin/MvvvmCross中有一种方法可以连接到本地ios应用程序DidEnterBackground?

编辑:我试过Ranjit的答案,但订阅消息似乎有问题。这是我的测试代码:

AppDelegate.cs:

public override void DidEnterBackground(UIApplication application)
{
base.DidEnterBackground(application);
var message = new LocationMessage(
this,
34
);
_messenger = Mvx.IoCProvider.Resolve<IMvxMessenger>();
_messenger.Publish(message);
}

基本类别:

public abstract class GenericMvxViewModel : MvxViewModel
{
private IMvxMessenger _messenger;

protected GenericMvxViewModel()
{
// other stuff
_messenger = Mvx.IoCProvider.Resolve<IMvxMessenger>();
_messenger.Subscribe<LocationMessage>(OnLocationMessage);
}
protected virtual void OnLocationMessage(LocationMessage locationMessage){} 
}

ViewModel:

public  class MyClassViewModel : GenericMvxViewModel
{
protected override void OnLocationMessage(LocationMessage locationMessage)
{
Debug.WriteLine(locationMessage.Lat);
}
}

消息在AppDelegate.cs中发布,但视图模型中的OnLocationMessage方法从未执行。

我还想知道如何正确地取消订阅该消息。ViewDestroy似乎是最自然的地方,但如前所述,它从未在iOS 上被调用

您的代码应该可以工作。我在我的应用程序中使用了相同的功能,它运行良好

GenericMvxViewModel代码

private MvxSubscriptionToken _locationEventToken;
public override void ViewAppeared()
{
SubscribeBaseLocationEvent();
base.ViewAppeared();
}
public override void ViewDisappeared()
{
if (StaticStorage.IsApplicationInForeground)
{
UnSubscribeBaseLocationEvent();
}
base.ViewDisappeared();
}
public void SubscribeBaseLocationEvent()
{
if (_locationEventToken == null)
{
_locationEventToken = Messenger.Subscribe<LocationMessage>(OnLocationMessage);
}
}
public void UnSubscribeBaseLocationEvent()
{
if (_locationEventToken != null)
{
Messenger.Unsubscribe<LocationMessage>(_locationEventToken);
_locationEventToken = null;
}
}

AppDelegate代码

public override void DidEnterBackground(UIApplication application)
{
base.DidEnterBackground(application);
StaticStorage.IsApplicationInForeground = false;
_messenger.Publish(new LocationMessage( this, 34 ));
}
public override void WillEnterForeground(UIApplication application)
{
StaticStorage.IsApplicationInForeground = true;
}

安卓

protected override void OnResume()
{
StaticStorage.IsApplicationInForeground = true;
base.OnResume();
}
protected override void OnStop()
{
StaticStorage.IsApplicationInForeground = false;
base.OnStart();
}

当应用程序从一个视图移动到另一个视图时,我们需要取消订阅该事件。但当应用程序移到后台时不会。因此,IsApplicationInForeground标志将有助于解决android的这个问题。因为对于android,当应用程序进入后台时,会调用ViewDisappeared。

就我而言。我有一个共同的活动,它持有碎片的剩余所有视图。因此,我在常见活动中添加了此代码。不确定你是如何使用的。但实施方式也将类似。

最新更新