所谓预启动,其实你一看那名字就知道是啥意思了,这是直接译,也找不到比这个叫法更简练的词了。在系统资源允许的情况下(比如电池电量充足,有足够的内存空间),系统会把用户常用的应用程序在后台启动,但不会显示用户界面。在预启动时,可以事先初始化一些数据,等到用户正式启动应用时,呈现界面的效率就有所提升。

预启动的时候,应用程序仍然会调用 OnLaunched 方法的,在 OnLaunched 方法调用之后,会马上发生 Suspending 事件,随后应用就会暂停。

当用户正式启动应用时,同样也会调用 OnLaunched 方法,那么,如何知道应用程序是正式启动还是预启动呢。OnLaunched 方法的参数有一个 PrelaunchActivated 属性,布尔类型,如果这个属性为真,说明当前调用是预启动;否则就是正式启动。因此,在处理 OnLaunched 方法时,只要判断这个属性就可以了,当它为false时,才去创建用户界面。

 

应用项目默认生成的模板代码是这样的:



protected override void OnLaunched(LaunchActivatedEventArgs e)
        {
            Frame rootFrame = Window.Current.Content as Frame;

            // 不要在窗口已包含内容时重复应用程序初始化,
            // 只需确保窗口处于活动状态
            if (rootFrame == null)
            {
                // 创建要充当导航上下文的框架,并导航到第一页
                rootFrame = new Frame();

                rootFrame.NavigationFailed += OnNavigationFailed;

                // 将框架放在当前窗口中
                Window.Current.Content = rootFrame;
            }

            if (e.PrelaunchActivated == false)
            {
                if (rootFrame.Content == null)
                {
                    // 当导航堆栈尚未还原时,导航到第一页,
                    // 并通过将所需信息作为导航参数传入来配置
                    // 参数
                    rootFrame.Navigate(typeof(MainPage), e.Arguments);
                }
                // 确保当前窗口处于活动状态
                Window.Current.Activate();
            }
        }



 它是先实例化作为UI根的 Frame 对象,然后再判断它是否为预启动,如果不是,就导航到主页面。

 

我们可以干脆这样修改:



protected override void OnLaunched(LaunchActivatedEventArgs e)
        {
            if (!e.PrelaunchActivated)
            {
                Frame rootVisual = Window.Current.Content as Frame;
                if (rootVisual == null)
                {
                    rootVisual = new Frame();
                    Window.Current.Content = rootVisual;
                }
                if (rootVisual.Content == null)
                {
                    rootVisual.Navigate(typeof(MainPage), e.Arguments);
                }
                Window.Current.Activate();
            }
        }



反正不创建UI了,弄个 Frame 在那里也没什么毛用,不如直接等到正式启动时再创建 Frame 。

 

补充一下,在e.PrelaunchActivated之前,需要调用以下代码来开启预启动:



CoreApplication.EnablePrelaunch(true);



参数是布尔类型,true表示启用预启动,false表示禁用预启动。

 

OK,现在大伙儿都知道怎么判断预启动了,那么,我如果要调试预启动,该做啥。要对预启动进行调试,不要直接运行调试,因为直接运行是进入正式启动方式,而不是预启动。

正确的操作是:依次执行菜单【调试】-【调试其他目标】-【调试通用 Windows 应用预启动】,然后就会执行 OnLaunched 方法,而 PrelaunchActivated 属性就能返回 true。

presto work启动命令 pre-launch_ui

 

 在调试的时候,应用不会引发 Suspending 事件,你可以通过【调试位置】工具栏控制应用进入 Suspend 状态。