我有一个为windows 8.1和windows phone 8.1构建的应用程序。在一个可移植类库中有一个带有静态成员的非静态类,该类库由平板电脑和手机项目共享。在电话中,墓碑上的静态属性会丢失。如何将可移植类库的静态类成员存储在停用事件中,并在手机生命周期的激活事件中恢复(到可移植类库中非静态类的当前实例),以便在tombstone之后应用程序继续运行而不会出现任何崩溃。
这取决于那些静态成员的访问级别。
如果它们是公共的,并且您可以直接从Windows Phone应用程序访问它们,那么您可以像通常一样在适当的应用程序生命周期处理程序中保存和恢复它们(或者使用SuspensionManager
类,如果您正在使用的话)。这意味着您的可移植类库不关心"应用程序生命周期"或"保存/恢复状态"或诸如此类的东西;相反,您的Windows Phone应用程序有责任提供此行为,并且您的可移植类库可以独立于此类Windows Phone特定要求。
如果它们是非公共的,那么您的可移植类库将需要提供一些保存和恢复其内部状态的方法。您可以公开静态方法来实现这一点,您可以在Windows Phone应用程序的适当应用程序生命周期处理程序中调用这些方法。例如,您的可移植类库中可能有一个方法,如:
public static void SaveState(Dictionary<string, object> stateDict)
{
// store state of static members in the dict
stateDict["Foo"] = SomeClass.FooStaticMember;
stateDict["Bar"] = SomeClass.BarStaticMember;
...
}
您可以在应用程序的挂起处理程序中调用此方法,例如:
public App()
{
this.InitializeComponent();
this.Suspending += this.OnSuspending;
}
private async void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
// save PCL state here
MyPortableClassLibrary.SaveState(SuspensionManager.SessionState);
await SuspensionManager.SaveAsync();
deferral.Complete();
}
类似地,当e.PreviousExecutionState == ApplicationExecutionState.Terminated
时,您将在App.OnLaunched
覆盖方法中加载状态。Pivot应用程序项目模板(或类似模板)包含应用程序生命周期事件的骨架代码,您可以从中进行操作。
如何将可移植类库的静态类成员存储在停用事件中并还原(到可移植类库内非静态类的当前实例)。。。
你的类是非静态的这一事实并不重要;该类中有静态成员,这些成员在该类的所有实例之间共享。您不能仅恢复类的一个实例的静态成员的状态;那没有任何意义。