这个问题比较常见,但是又不太好说,我理解上是这样的(纯属个人理解),windows phone 8的前台一次只能跑一个程序,那么如果开启其它应用的时候,之前的应用程序又没有退出,那么它就处于休眠状态,存放在手机的内存中。若再后退到之前的应用,系统会自动恢复其状态。
但是有个时候不是这样,首先系统最多只能维持5个应用程序的状态。当多了的时候,系统会把早期的应用逻辑删除。这时候程序 的 Closing事件没有触发。若用户再次回到被系统逻辑删除的应用的时候程序的构造类会被加载,但是不会触发Launching 事件。之前的用户的会丢失。
我在第一章生命周期中提到了生命周期4事件。程序加载的时候会先触发Launching事件,但是当逻辑删除后,重新加载程序的时候就不触发了。当用户离开导航的时候触发Deactivate 事件,如果回到程序触发Activate 事件,通过参数ActivatedEventArgs 的IsApplicationInstancePreserved属性 判断程序是否是从休眠中恢复。
所以我们一般在发生Deacivated事件的时候,把必要的状态信息 保存到PhoneApplicationService 类的 State中。
举个实例,我们重新建立一个APP取名 App2
然后我们在App.xaml.cs 中添加一个string型 公共属性 MyData。
public string MyData { get; set; }
当程序加载的时候 我们给 MyData 赋值 “ Hello World ”。
private void Application_Launching(object sender, LaunchingEventArgs e)
{
MyData = " Hello World !";
}
在MainPage.xaml 中放一个 TextBlock 控件以显示 MyData 的值。
public partial class MainPage : PhoneApplicationPage
{
//标识是否通过构造函数
bool isNewPage = false;
// Constructor
public MainPage()
{
InitializeComponent();
isNewPage = true;
// Sample code to localize the ApplicationBar
//BuildLocalizedApplicationBar();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (isNewPage)
{
if (!string.IsNullOrEmpty((Application.Current as App).MyData))
{
tbShowData.Text = (Application.Current as App).MyData;
}
isNewPage = false;
}
}
}
找5以上应用比较麻烦,因此我们在项目上 "右键“ -> ”项目属性“ -> 左侧” 调试“选项卡 -> 勾上"在调试且停用时候执行逻辑删除" 如图
然后保存 运行模拟器。看到 Hello World ,然后我们点击 ”开始“进入主界面,点击后退 Hello World 没有了。
然后我们继续完善上面的实例,让它保存且能恢复
到App.xaml.cs 中分别完善Activated 和Deactivated 事件代码如下。
// Code to execute when the application is activated (brought to foreground)
// This code will not execute when the application is first launched
private void Application_Activated(object sender, ActivatedEventArgs e)
{
if (e.IsApplicationInstancePreserved)
{
return;
}
//从状态 字典中恢复
if (PhoneApplicationService.Current.State.ContainsKey("mydata"))
{
MyData = PhoneApplicationService.Current.State["mydata"] as string;
}
}
// Code to execute when the application is deactivated (sent to background)
// This code will not execute when the application is closing
private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
//应用程序被取消激活状态的时候
if (!string.IsNullOrEmpty(MyData))
{
PhoneApplicationService.Current.State["mydata"] = MyData;
}
}
OK我们运行模拟器,发现当我们点击”开始“后在”后退“到程序时候 Hello World 依旧显示。
这章建议大家手动敲一遍。
代码下载 地址 http://download.csdn.net/detail/gongkepop/6043173
(写的不好 请见谅,有不对请留言告知我,免得误人子弟。)