新时尚Windows8开发(2):应用程序生命周期
2012-08-18 11:20
211 查看
老周的博客专栏:http://blog.csdn.net/tcjiaan
转载请注明原作者和出处。
创建Win8“板砖”应用后,我们不妨关注一下App类。在生成的代码中我们可以看到,主要处理了两个事件:
一、重写OnLaunched方法;
二、处理Suspending事件。
App类的代码如下,这是项目模板生成的。
那么,处理这两个事件干吗?各位还记得Windows Phone开发的时候,我们说到的应用程序状态吗?在应用程序挂起或者结束后,状态信息有可能会丢失,我们会在适当的时候保存状态信息,在必要时恢复。
现在我们把OnLaunched方法改一下,修改后如下所示。
要理解某一东西,最好的方法,莫过于亲自来试一试。
按F5运行应用程序,注意看“输出”窗口,如果没有打开“输出”窗口,在程序运行后,回到VS,从“调试”菜单下的“窗口”里面找。
当程序运行后,再回到VS,我们在“输出”窗口中看到的是“程序未运行”。
哦?这是为什么呢?程序运行了,怎么会未运行呢?
看清楚了,args.PreviousExecutionState属性指的是应用程序被激活时的“前一个状态”,我们第一次运行程序,那么它的前一个状态当然是未运行了。
在“调试位置”(这个估计翻译问题,其实也挺难翻译的)中,在下拉列表中选择“挂起”,这样我们可以模拟应用程序挂起。
选择后,再点一下“挂起”,这时候,应用程序已经挂起。
接着,再选择“继续”。
再点击一下“继续”,这时候,将模拟应用程从挂起状态恢复。
我们发现,在“挂起”和“继续”之间并没有输出内容。因为在这两个状态切换之间,应用程序仍在运行,也就是说,应用程序没有执行OnLaunched方法。
这时候,我们点击“开始”,回到开始屏幕,并切换到Windows桌面,然后把鼠标移到左上角,当看到应用程序的窗口时,把它拖进桌面,不要松开鼠标,直接向下扔,就像扔垃圾一样。这样,就关闭了应用程序。当然,还有一种方法,当鼠标移到屏幕左上角,当看到应用程序缩略图时,右击,从弹出菜单中选择“关闭”也可以关闭应用程序。
这样,应用程序是被用户关闭了的,接着,回到VS,稍等一下,等调试结束后,按F5再次运行。看看这回会输出什么?
因为刚才我们通过用户操作终止应用程序,再次运行,OnLaunched方法被执行,这时候,输出内容为“应用程序被用户关闭”,即前一个状态。
就像当初模板生成的代码一样,保存和恢复状态数据,只关注Launch和Suspend两个行为即可,上面的试验说明,应用程序被激活有两个状态:挂起后终止,用户关闭。这两种情况下我们需要恢复相关数据,即
ApplicationExecutionState.Terminated
ApplicationExecutionState.ClosedByUser
其实,按照VS生成的代码模板和注释提示处理即可,这里我只是为了演示才修改了代码。
转载请注明原作者和出处。
创建Win8“板砖”应用后,我们不妨关注一下App类。在生成的代码中我们可以看到,主要处理了两个事件:
一、重写OnLaunched方法;
二、处理Suspending事件。
App类的代码如下,这是项目模板生成的。
namespace MyApp { /// <summary> /// 提供特定于应用程序的行为,以补充默认的应用程序类。 /// </summary> sealed partial class App : Application { /// <summary> /// 初始化单一实例应用程序对象。这是执行的创作代码的第一行, /// 逻辑上等同于 main() 或 WinMain()。 /// </summary> public App() { this.InitializeComponent(); this.Suspending += OnSuspending; } /// <summary> /// 在应用程序由最终用户正常启动时进行调用。 /// 当启动应用程序以执行打开特定的文件或显示搜索结果等操作时 /// 将使用其他入口点。 /// </summary> /// <param name="args">有关启动请求和过程的详细信息。</param> protected override void OnLaunched(LaunchActivatedEventArgs args) { Frame rootFrame = Window.Current.Content as Frame; // 不要在窗口已包含内容时重复应用程序初始化, // 只需确保窗口处于活动状态 if (rootFrame == null) { // 创建要充当导航上下文的框架,并导航到第一页 rootFrame = new Frame(); if (args.PreviousExecutionState == ApplicationExecutionState.Terminated) { //TODO: 从之前挂起的应用程序加载状态 } // 将框架放在当前窗口中 Window.Current.Content = rootFrame; } if (rootFrame.Content == null) { // 当未还原导航堆栈时,导航到第一页, // 并通过将所需信息作为导航参数传入来配置 // 参数 if (!rootFrame.Navigate(typeof(MainPage), args.Arguments)) { throw new Exception("Failed to create initial page"); } } // 确保当前窗口处于活动状态 Window.Current.Activate(); } /// <summary> /// 在将要挂起应用程序执行时调用。在不知道应用程序 /// 将被终止还是恢复的情况下保存应用程序状态, /// 并让内存内容保持不变。 /// </summary> /// <param name="sender">挂起的请求的源。</param> /// <param name="e">有关挂起的请求的详细信息。</param> private void OnSuspending(object sender, SuspendingEventArgs e) { var deferral = e.SuspendingOperation.GetDeferral(); //TODO: 保存应用程序状态并停止任何后台活动 deferral.Complete(); } } }
那么,处理这两个事件干吗?各位还记得Windows Phone开发的时候,我们说到的应用程序状态吗?在应用程序挂起或者结束后,状态信息有可能会丢失,我们会在适当的时候保存状态信息,在必要时恢复。
现在我们把OnLaunched方法改一下,修改后如下所示。
protected override void OnLaunched(LaunchActivatedEventArgs args) { /*------------------------------------------------------------------------------------*/ // 判断前一个状态 string State = string.Empty; switch (args.PreviousExecutionState) { case ApplicationExecutionState.ClosedByUser: State = string.Format("{0} - 应用程序被用户关闭。", DateTime.Now.ToString("HH:mm:ss")); break; case ApplicationExecutionState.NotRunning: State = string.Format("{0} - 应用程序未运行。", DateTime.Now.ToString("HH:mm:ss")); break; case ApplicationExecutionState.Running: State = string.Format("{0} - 应用程序正在运行。", DateTime.Now.ToString("HH:mm:ss")); break; case ApplicationExecutionState.Suspended: State = string.Format("{0} - 应用程序被挂起。", DateTime.Now.ToString("HH:mm:ss")); break; case ApplicationExecutionState.Terminated: State = string.Format("{0} - 应用程序终止运行。", DateTime.Now.ToString("HH:mm:ss")); break; default: State = "无"; break; } System.Diagnostics.Debug.WriteLine(State); /*------------------------------------------------------------------------------------*/ …… }
要理解某一东西,最好的方法,莫过于亲自来试一试。
按F5运行应用程序,注意看“输出”窗口,如果没有打开“输出”窗口,在程序运行后,回到VS,从“调试”菜单下的“窗口”里面找。
当程序运行后,再回到VS,我们在“输出”窗口中看到的是“程序未运行”。
哦?这是为什么呢?程序运行了,怎么会未运行呢?
看清楚了,args.PreviousExecutionState属性指的是应用程序被激活时的“前一个状态”,我们第一次运行程序,那么它的前一个状态当然是未运行了。
在“调试位置”(这个估计翻译问题,其实也挺难翻译的)中,在下拉列表中选择“挂起”,这样我们可以模拟应用程序挂起。
选择后,再点一下“挂起”,这时候,应用程序已经挂起。
接着,再选择“继续”。
再点击一下“继续”,这时候,将模拟应用程从挂起状态恢复。
我们发现,在“挂起”和“继续”之间并没有输出内容。因为在这两个状态切换之间,应用程序仍在运行,也就是说,应用程序没有执行OnLaunched方法。
这时候,我们点击“开始”,回到开始屏幕,并切换到Windows桌面,然后把鼠标移到左上角,当看到应用程序的窗口时,把它拖进桌面,不要松开鼠标,直接向下扔,就像扔垃圾一样。这样,就关闭了应用程序。当然,还有一种方法,当鼠标移到屏幕左上角,当看到应用程序缩略图时,右击,从弹出菜单中选择“关闭”也可以关闭应用程序。
这样,应用程序是被用户关闭了的,接着,回到VS,稍等一下,等调试结束后,按F5再次运行。看看这回会输出什么?
因为刚才我们通过用户操作终止应用程序,再次运行,OnLaunched方法被执行,这时候,输出内容为“应用程序被用户关闭”,即前一个状态。
就像当初模板生成的代码一样,保存和恢复状态数据,只关注Launch和Suspend两个行为即可,上面的试验说明,应用程序被激活有两个状态:挂起后终止,用户关闭。这两种情况下我们需要恢复相关数据,即
ApplicationExecutionState.Terminated
ApplicationExecutionState.ClosedByUser
其实,按照VS生成的代码模板和注释提示处理即可,这里我只是为了演示才修改了代码。
相关文章推荐
- 新时尚Windows8开发(4):保存/读取本地应用程序设置
- Windows8 Metro开发 (01) : Metro应用程序生命周期
- 新时尚Windows8开发(1):如何创建应用程序项目
- 新时尚Windows8开发(3):应用程序状态
- 新时尚Windows8开发(19):为应用程序定义“设置”面板
- 新时尚Windows8开发(27):根据应用程序的视图状态调整UI
- IOS开发指南读书笔记2(应用程序的生命周期)
- 新时尚Windows8开发(32):Json数据处理(A)
- 新时尚Windows8开发(22):ListBox与ComboBox
- iOS开发学习之导航控制器和应用程序的生命周期
- Windows Store apps开发[13]应用程序生命周期
- 基于VisualStudio11开发Windows8的Direct2D-Metro应用程序范例(2) 国际化文字展示
- 基于Windows8与Visual Studio11开发第一个USB驱动应用程序
- Windows Phone Mango开发实践——应用程序生命周期
- 新时尚Windows8开发(26):后台播放Musics
- win8开发(2)——应用程序生命周期
- Windows8 Metro开发 (04) : 保存/读取本地应用程序设置
- 新时尚Windows8开发(31):去掉文本中的HTML标记
- iOS开发系列--iOS应用程序生命周期(前后台切换,应用的各种状态)详解
- 基于VisualStudio11开发Windows8的Direct2D-Metro应用程序范例(2) 国际化文字展示