我有一个为 windows 8.1 和 windows phone 8.1 构建的应用程序。在可移植类库中有一个具有静态成员的非静态类,由平板电脑和手机项目共享。在电话中,在墓碑化时,静态属性会丢失。如何将可移植类库的静态类成员存储在停用事件中,并在手机生命周期的激活事件中恢复(到可移植类库中非静态类的当前实例),以便在墓碑化后应用程序继续运行而没有任何崩溃。
1 回答
这取决于这些静态成员的访问级别。
如果它们是公开的并且您可以直接从您的 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();
}
同样,您将在您的App.OnLaunched
覆盖方法中加载状态 when e.PreviousExecutionState == ApplicationExecutionState.Terminated
。Pivot App 项目模板(或类似模板)包含您可以使用的应用程序生命周期事件的框架代码。
如何将可移植类库的静态类成员存储在停用事件中并恢复(到可移植类库中非静态类的当前实例)...
您的课程是非静态的这一事实并不重要。您在该类中有静态成员,这些成员在该类的所有实例之间共享。你不能只恢复你的类的一个实例的静态成员的状态;这没有任何意义。