问题描述
我正在创建的UWP应用程序需要拦截Suspending事件,并通过OnSuspending事件处理程序将其写入日志文件。
我了解MVVMCross使用其自己的SuspensionManager,即MvxSuspensionManager。我已经在www.mvvmcross.com中搜索了MvxSuspensionManager文档,但找不到任何文档。我已经进行了一般搜索,发现了一些信息,但它与版本5有关,并且没有涉及任何细节。我确实发现有一个报告的错误,我也曾经遇到过(https://github.com/MvvmCross/MvvmCross/issues/3772),该错误已得到修复,但尚未掌握。
- 我想知道如何实现MvxSuspensionManager以满足要求。
- 是否有任何示例代码或文档说明如何设置?
- 何时发布包含错误修复程序(https://github.com/MvvmCross/MvvmCross/pull/3821)的新MVVMCross版本?
非常感谢您的协助。
解决方法
在您的MvxWindowsSetup
上,您可以覆盖CreateSuspensionManager
并创建自己的。您只需要从类中的MvxSuspensionManager
继承(或实现IMvxSuspensionManager
),并覆盖SaveAsync
之类的所需方法即可。因此,您可以通过覆盖SaveAsync
并与PR中相同的方法来解决此问题(此外,您也可以在其中添加自定义行为)(如果需要的话):
public class MyCustomMvxSuspensionManager : MvxSuspensionManager
{
try
{
// Save the navigation state for all registered frames
foreach (var weakFrameReference in _registeredFrames)
{
IMvxWindowsFrame frame;
if (weakFrameReference.TryGetTarget(out frame))
{
SaveFrameNavigationState(frame);
}
}
// Serialize the session state synchronously to avoid asynchronous access to shared
// state
using (var memoryStream = new MemoryStream())
{
var serializer = new DataContractSerializer(typeof(Dictionary<string,object>),KnownTypes);
serializer.WriteObject(memoryStream,SessionState);
// Get an output stream for the SessionState file and write the state asynchronously
var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(SessionStateFilename,CreationCollisionOption.ReplaceExisting);
using (var fileStream = await file.OpenStreamForWriteAsync().ConfigureAwait(false))
{
memoryStream.Seek(0,SeekOrigin.Begin);
await memoryStream.CopyToAsync(fileStream).ConfigureAwait(false);
await fileStream.FlushAsync().ConfigureAwait(false);
}
}
}
catch (Exception e)
{
throw new MvxSuspensionManagerException(e);
}
}
--------
public class MySetup : MvxWindowsSetup
{
...
protected override IMvxSuspensionManager CreateSuspensionManager()
{
return new MyCustomMvxSuspensionManager();
}
...
}
还可以看到here,默认情况下,它会使用应用程序的根框架将MvxSuspensionManager
初始化,您也可以更改此设置并覆盖设置InitializeSuspensionManager
,或者您想要注册另一个框架来管理其会话,则只要在应用中的任何位置都可以解析IMvxSuspensionManager
,然后使用自定义会话状态密钥:Mvx.IoCProvider.Resolve<IMvxSuspensionManager>().RegisterFrame(_myFrame,_suspensionManagerMySessionStateKey)
调用注册。
最后,我强烈建议您阅读MvxSuspensionManager implementation,以便您了解幕后发生的事情。
HIH