日期:2014-05-17  浏览次数:20801 次

先玩为快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;