如何解决Xamarin MvvmCross:iOS 如何监控应用程序已移至前台/后台
我有一个 MvvmCross 应用程序,我正在使用 MvvmCross ViewModel Lifecycle 函数来实现 视图出现、移至背景和移至前景时的某些操作:
- public override async void ViewAppeared()
- public override async void ViewAppearing()
- public override void ViewDisappearing()
- public override void ViewDisappeared()
- public override void ViewDestroy(bool viewFinishing)
这些功能在我的 Android 设备上运行良好。 但是对于 iOS,当应用程序移动到后台或前台时,它们不会被触发 (不过,除了 ViewDestroy,它们在 iOS 应用程序的屏幕之间导航时会触发)
1) 这是预期的行为,还是我遗漏了什么?
2)如果是这样,当应用程序移动到前台/后台时我们需要执行某些操作(例如停止计时器)时,我们必须遵循的方法是什么? 我们是否应该有两种实现,一种用于 android,一种用于 ios?我还尝试了 MvxBaseViewController 中的 ViewDidDisappear 方法, 当应用程序移动到后台时,它仍然没有被激活。 Xamarin/MvvmCross 有办法挂钩到原生 ios applicationDidEnterBackground 吗?
编辑: 我已经尝试过 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){}
}
视图模型:
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。
就我而言。我有一个共同的活动,它包含片段的剩余所有视图。所以,我在公共活动中添加了这个代码。不确定您的情况如何使用。但实现将是相似的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。