`
aijuans
  • 浏览: 1560034 次
社区版块
存档分类
最新评论

先玩为快Windows8开发(2):应用程序生命周期

阅读更多

创建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生成的代码模板和注释提示处理即可,这里我只是为了演示才修改了代码。

 

更多详细信息请查看java教程网 http://www.itchm.com/forum-59-1.html
分享到:
评论

相关推荐

    Windows_Phone_7_应用程序生命周期

    ### Windows Phone 7 应用程序生命周期:Tombstoning详解 #### 概述 Windows Phone 7 的应用程序生命周期管理是一套复杂而精细的机制,旨在优化用户体验和设备性能。在这一平台上,应用程序的生命周期受制于特定的...

    Windows 8应用商店程序开发源程序

    Windows 8应用商店是发布和获取这些应用程序的平台,为开发者提供了广泛的潜在用户群体。 开发Windows 8应用商店程序主要涉及以下知识点: 1. **编程语言和框架**:Windows 8应用通常使用XAML(Extensible ...

    安全开发生命周期

    ### 安全开发生命周期(SDL)概览 #### 一、SDL概念 安全开发生命周期(SDL, Security Development Lifecycle)是一种旨在确保软件在各个开发阶段都融入了安全性考量的方法论。这种方法论着重于通过在软件开发早期阶段...

    用MFC开发Windows应用程序1

    - **CTestApp**: 应用程序类,负责管理应用程序生命周期,初始化资源等。 - **CMainFrame**: 主框架窗口类,用于管理主程序窗口,显示标题栏、工具栏、状态栏等,并处理窗口操作消息。 - **CTestDoc**: 文档类,...

    Windows应用程序编程指南 pdf

    以上内容涵盖了《Windows应用程序编程指南》pdf文件中的核心知识点,旨在帮助开发者更好地理解和掌握Hopen操作系统下的应用程序开发技巧。通过这些知识点的学习,开发者不仅能够快速上手开发工作,还能深入了解Hopen...

    Windows应用程序框架MFC

    MFC将Windows API中的函数和数据封装为类,利用面向对象的特性如继承和多态,使得开发者可以通过派生和定制已有类来构建自己的应用程序框架,从而提高开发效率。 在MFC框架中,有两个关键的类:CWinApp和CFrameWnd...

    WPF 应用程序开发.pdf

    2. **XAML 浏览器应用程序 (Xbap)**:一种特殊的基于Web的应用程序,其主要组成元素为XAML页面,可以在Web浏览器(例如Internet Explorer和Firefox)中运行。 3. **自定义控件库**:非可执行程序集,包含了一系列可...

    C++&CLR(VS2015)编写 Windows 窗体应用程序

    ### C++ & CLR (VS2015) 编写 Windows 窗体应用程序 #### 知识点一:理解CLR与C++ - **CLR(Common Language Runtime)**:是.NET框架的核心组件之一,提供了执行环境,使得开发人员能够用多种编程语言编写代码,...

    自己做的win8应用程序

    如果你想要学习如何在Windows 8上开发应用程序,查看并研究这样的源码是一个很好的起点。你可以从中了解应用的架构设计、功能实现、数据处理以及用户界面的构建方法。 从标签“win8 应用”我们可以推断,这个项目...

    windows 8 metro revealed: html5 and javascript

    在探讨如何使用HTML5和JavaScript开发Windows 8 Metro应用程序之前,我们先来了解一些基础知识。 #### 一、Windows 8 Metro 应用程序概述 Windows 8引入了一种全新的应用类型——Metro应用(现称为Modern应用或UWP...

    MFC Windows应用程序设计(任哲第3版)教材例题代码

    《MFC Windows应用程序设计》是任哲编著的关于Windows应用程序开发的专业教材,主要围绕Microsoft Foundation Classes (MFC) 库展开,该库是微软提供的一套C++类库,用于简化Windows API的使用,帮助开发者构建高效...

    windows服务程序开发模式

    在开发Windows服务程序时,要注意服务的生命周期管理和正确处理各种服务控制信号,确保服务能够正常启动、运行、停止以及响应系统事件。此外,还需要考虑服务的安全性,避免未经授权的访问和操作。 总之,Windows...

    微软 C#系列课程(1):应用程序的执行

    在本课程“微软C#系列课程(1):应用程序的执行”中,我们将深入探讨C#编程语言的基础,特别是关于如何启动和管理一个C#应用程序的生命周期。这是一系列现代C#教程的第一部分,由微软中国MSDN特约教师精心制作,旨在...

    Windows.7设备驱动程序开发

    《Windows 7设备驱动程序开发》是一本深入探讨Windows操作系统下设备驱动程序设计与实现的专业书籍。这本书由Ronald D. Reeves撰写,旨在帮助开发者理解并掌握在Windows 7环境下编写设备驱动程序的关键技术和方法。 ...

    基于.NET2.0Windows窗体应用开发+.NET2.0程序设计微软考试认证

    .NET框架是微软推出的一种开发平台,它为开发者提供了丰富的类库和工具,使得构建桌面应用程序、Web应用程序和服务变得更加便捷。本资源聚焦于基于.NET 2.0版本的Windows窗体应用开发和.NET 2.0程序设计,这两个主题...

    VS2008下C++开发Windows服务程序

    Windows服务是一种在后台运行的应用程序,即使没有用户登录也能工作,它们通常用于执行系统级任务或为其他应用程序提供功能。 1. **C++ Windows服务基础** - Windows服务是Windows操作系统中的一个特殊类型的进程...

    Windows 8 程序开发 入门经典 (英文版)

    《Windows 8程序开发入门经典》是一本专为开发者准备的指南,旨在引导读者进入Windows 8应用程序开发的世界。该书由Wrox出版社出版,英文版提供了全面且深入的介绍,帮助初学者理解和掌握开发Windows 8应用所需的...

Global site tag (gtag.js) - Google Analytics