所謂預啟動,其實你一看那名字就知道是啥意思了,這是直接譯,也找不到比這個叫法更簡練的詞了。在系統資源允許的情況下(比如電池電量充足,有足夠的內存空間),系統會把用戶常用的應用程序在后台啟動,但不會顯示用戶界面。在預啟動時,可以事先初始化一些數據,等到用戶正式啟動應用時,呈現界面的效率就有所提升。
預啟動的時候,應用程序仍然會調用 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。
在調試的時候,應用不會引發 Suspending 事件,你可以通過【調試位置】工具欄控制應用進入 Suspend 狀態。
好了,本文內容實在太簡單了,為了節約時間,此處省略 310 個字…… 本文結束。