博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows 8 应用开发 - 挂起与恢复
阅读量:6916 次
发布时间:2019-06-27

本文共 3601 字,大约阅读时间需要 12 分钟。

原文:

     Windows 8 应用通常涉及到两种数据类型:应用数据与会话数据。在上一篇提到的就是应用层面的数据,包括应用参数设置、用户重要数据等。那么会话层面的数据是基于用户每次使用应用而形成,这些数据可能不需要留存在设备中。在整个应用生命周期中,应用启动后便进入运行状态。当用户离开或系统进入待机状态时,应用会进入挂起状态,此时应用将被放入到内存中,待用户重新使用时便会恢复成运行状态。

IC576232

     在这个过程中用户之前可能已经录入了一些数据,并且希望在应用恢复时可以继续进行录入。对于开发者来说,我们需要在应用挂起时将一些会话数据进行保存,当应用恢复后同时将暂存数据复原,以便让用户继续使用。需要注意的是MSDN中提到:“当用户通过按 Alt+F4 或使用关闭手势关闭应用时,应用将被挂起 10 秒钟然后被终止。”也就意味着关闭的应用只有10秒钟时间可以被恢复。下面将通过实例进行演示,首先创建一个Textbox 让用户录入名字进行会话操作。我们首先来尝试一下没有进行挂起暂存处理的应用是何种结果。

挂起

     直接按F5运行应用,在Name 栏中输入名字或任意字符。在VS2012的Debug Location 工具栏可以看到挂起(Suspend )的选项,我们选择挂起并终止(Suspend and shutdown),程序挂起后从系统左侧菜单栏里找到之前的应用重新启用,恢复后的应用Name 栏中的文字已经丢失。对于名字这样的简单录入还可以接受,如果录入项较多的话那将损失惨重。

image

     接下来我们将进行应用挂起处理,打开App.xaml.cs 程序,在OnLaunched 方法中创建了rootFrame,当rootFrame 为Null 时将重新创建Frame,在这个逻辑判断中要使用SuspensionManager.RegisterFrame 方法进行rootFrame 注册,这样才可以使应用获得根Frame 信息并进行数据存储。

if (rootFrame == null){    // Create a Frame to act as the navigation context and navigate to the first page    rootFrame = new Frame();    SuspensionDemo.Common.SuspensionManager.RegisterFrame(rootFrame, "appFrame");    if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)    {        //TODO: Load state from previously suspended application    }    // Place the frame in the current Window    Window.Current.Content = rootFrame;}

     在OnSuspending 方法中,使用SuspensionManager.SaveAsync 方法将挂起应用的当前状态进行保存,这里可以调用操作来进行处理。

private async void OnSuspending(object sender, SuspendingEventArgs e){    var deferral = e.SuspendingOperation.GetDeferral();    //TODO: Save application state and stop any background activity    await SuspensionDemo.Common.SuspensionManager.SaveAsync();    deferral.Complete();}

     注册完成后,打开MainPage.xaml.cs 在SaveState 方法中添加如下代码,使应用挂起时能将Name 字段保存起来。

protected override void SaveState(Dictionary
pageState){ pageState["name"] = nameInput.Text;}

恢复

     挂起操作完成后,就要进行恢复操作,将暂存的数据恢复到应用中。再次打开App.xaml.cs 在PreviousExecutionState 判断为Terminated 时加入SuspensionManager.RestoreAsync 方法恢复以前的应用状态。

protected async override void OnLaunched(LaunchActivatedEventArgs args){    Frame rootFrame = Window.Current.Content as Frame;    // Do not repeat app initialization when the Window already has content,    // just ensure that the window is active    if (rootFrame == null)    {        // Create a Frame to act as the navigation context and navigate to the first        rootFrame = new Frame();                SuspensionDemo.Common.SuspensionManager.RegisterFrame(rootFrame, "appFrame");                if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)        {            //TODO: Load state from previously suspended application            await SuspensionDemo.Common.SuspensionManager.RestoreAsync();        }        // Place the frame in the current Window        Window.Current.Content = rootFrame;    }    if (rootFrame.Content == null)    {        // When the navigation stack isn't restored navigate to the first page,        // configuring the new page by passing required information as a navigation        // parameter        if (!rootFrame.Navigate(typeof(MainPage), args.Arguments))        {            throw new Exception("Failed to create initial page");        }    }    // Ensure the current window is active    Window.Current.Activate();}

     最后,在MainPage.xaml.cs 的LoadState 方法中将pageState的Name 字段内容恢复即可。我们再次F5运行应用;录入姓名;挂起并终止应用,应用恢复后可以看到之前录入的姓名仍然存在。

protected override void LoadState(Object navigationParameter, Dictionary
pageState){ if (pageState != null && pageState.ContainsKey("name")) { nameInput.Text = pageState["name"].ToString(); }}

源码下载

转载地址:http://hsxcl.baihongyu.com/

你可能感兴趣的文章
陈松松:如何保证每天录制一个视频,一年365个原创视频
查看>>
Java笔试题解(13)
查看>>
我的友情链接
查看>>
Hbase的WAL在RegionServer基本调用过程
查看>>
sql语句中left join中的on与where的区别
查看>>
RHEL6.0源码编译安装小企鹅输入法fcitx-4.0.0
查看>>
JVM系列(一)
查看>>
mybatis中的choose标签的使用
查看>>
mysql数据库与web主机分离实验
查看>>
HTTP Status 400 - Required MultipartFile parameter 'logoFole' is not present
查看>>
关于java字符串常用一些api 效率比拼小结(java对大型的字符串api处理效率比拼)...
查看>>
PHP句法规则详解
查看>>
h2 数据文件解析
查看>>
DML、DDL、DCL区别
查看>>
freemarker集成shiro标签
查看>>
java中File类的getPath(),getAbsolutePath(),getCanonicalPath()区别
查看>>
Spring Boot 2.x 启动全过程源码分析(上)入口类剖析
查看>>
Java应用性能管理工具 Pinpoint
查看>>
jQuery UI Accordion in ASP.NET MVC - feed with data from database
查看>>
Linux运维课之Mysql cluster随堂视频
查看>>