自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Windows Phone 8.1 應(yīng)用生命周期

移動(dòng)開發(fā)
在 8.0 時(shí)代,不斷的按下“后退鍵”就可以完全的關(guān)閉并且終止應(yīng)用,但在 8.1 中,這樣的行為只會(huì)讓應(yīng)用處在 Suspended(掛起)狀態(tài),可以通過長(zhǎng)按“后退鍵”進(jìn)入多任務(wù)界面查看。 那如果還想像 8.0 一樣終止應(yīng)用呢?(雖然不推薦也沒有必要)可以在多任務(wù)界面點(diǎn)擊應(yīng)用右上角的“叉叉”或者向下滑。

一、“后退鍵”不會(huì)終止應(yīng)用

關(guān)于 Windows Phone 8.1 的應(yīng)用生命周期,***個(gè)要知道的關(guān)鍵就是:“后退鍵”不會(huì)終止應(yīng)用!

在 8.0 時(shí)代,不斷的按下“后退鍵”就可以完全的關(guān)閉并且終止應(yīng)用,但在 8.1 中,這樣的行為只會(huì)讓應(yīng)用處在 Suspended(掛起)狀態(tài),可以通過長(zhǎng)按“后退鍵”進(jìn)入多任務(wù)界面查看。

那如果還想像 8.0 一樣終止應(yīng)用呢?(雖然不推薦也沒有必要)可以在多任務(wù)界面點(diǎn)擊應(yīng)用右上角的“叉叉”或者向下滑。

 

二、應(yīng)用生命周期

應(yīng)用的三個(gè)狀態(tài)分別是:

A:NotRunning

也就是還沒開啟過應(yīng)用,在多任務(wù)界面沒有該應(yīng)用時(shí)。

B:Running

在屏幕上顯示的應(yīng)用就是 Running 狀態(tài),同時(shí)只會(huì)有 1 個(gè)應(yīng)用處于 Running 狀態(tài)。

C:Suspended

不在屏幕上顯示并能在多任務(wù)界面查看的應(yīng)用則處于 Suspended(掛起)狀態(tài)。

 

三種狀態(tài)間切換的操作:

(1)NotRunning -> Running

要從 NotRunning 切換到 Running 狀態(tài),其實(shí)也就是開啟應(yīng)用,可通過點(diǎn)擊應(yīng)用磁貼、應(yīng)用間協(xié)議啟動(dòng)、Cortana等方式。

在狀態(tài)的切換過程中會(huì)觸發(fā) OnLaunched 事件。

(2)Running -> Suspended

當(dāng)應(yīng)用不再占據(jù)屏幕時(shí)則從 Running 切換到 Suspended 狀態(tài),可以是“Win”鍵、“返回鍵”,有電話打來時(shí)也會(huì)掛起。

在狀態(tài)的切換過程中會(huì)觸發(fā) OnSuspending 事件。

(3)Suspended -> Running

如果在應(yīng)用掛起狀態(tài)時(shí)沒有因?yàn)槟承┰颍ū热鐑?nèi)存不足)導(dǎo)致應(yīng)用終止的話,點(diǎn)擊磁貼或者多任務(wù)切換都會(huì)讓應(yīng)用從 Suspender 返回到 Running 狀態(tài)。

在狀態(tài)的切換過程中會(huì)依次觸發(fā) OnResuming 和 OnLaunched 事件。

(4)Suspended -> NotRunning

如果在應(yīng)用掛起狀態(tài)時(shí)因?yàn)槟承┰颍ū热鐑?nèi)存不足)導(dǎo)致應(yīng)用終止的話,則會(huì)從 Suspended 變成 NotRunning 狀態(tài)。

在這過程不會(huì)觸發(fā)任何事件。

 #p#

三、OnSuspending

因?yàn)閼?yīng)用在掛起狀態(tài)時(shí),并不能預(yù)測(cè)應(yīng)用是否會(huì)因?yàn)槟承┰颍ū热鐑?nèi)存不足)而終止,而在這終止過程中也沒有事件讓開發(fā)者處理應(yīng)用數(shù)據(jù),所以只能在應(yīng)用將要掛起時(shí)準(zhǔn)備。因此 OnSuspending 事件變得十分重要。

若要使用 OnSuspending 方法則先要在構(gòu)造函數(shù)中添加對(duì)其的引用:

  1. public App() 
  2.   this.InitializeComponent(); 
  3.   this.Suspending += OnSuspending; 
而在 OnSuspending 方法中可以根據(jù)需要保存頁面數(shù)據(jù),比如輸入框內(nèi)的文本、頁面導(dǎo)航歷史等,可以通過保存在應(yīng)用獨(dú)立存儲(chǔ)中或利用 NavigationHelper 和 SuspensionManager 類等:
  1. async void OnSuspending(object sender, SuspendingEventArgs e) 
  2.     SuspendingDeferral deferral = e.SuspendingOperation.GetDeferral(); 
  3.  
  4.     await this.SaveStateToLocalFile(Data.Value); 
  5.  
  6. await SuspensionManager.SaveAsync(); 
  7.  deferral.Complete();

如果只想保存某個(gè)頁面的信息則可以在 SaveState 中保存

  1. private void NavigationHelper_SaveState(object sender, SaveStateEventArgs e) 
  2.      e.PageState["isEditing"] = true
  3.      e.PageState["currentText"] = this.viewModel.DataItem.Title; 

NavigationHelper 和 SuspensionManager 類是添加基本頁時(shí) Visual Studio 自動(dòng)添加的

  1. public class NavigationHelper : DependencyObject 
  2.     private Page Page { get; set; } 
  3.     private Frame Frame { get { return this.Page.Frame; } } 
  4.  
  5.     public NavigationHelper(Page page) 
  6.     { 
  7.         this.Page = page; 
  8.  
  9.         this.Page.Loaded += (sender, e) => 
  10.         { 
  11. WINDOWS_PHONE_APP 
  12.             Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed; 
  13.  
  14. if 
  15.         }; 
  16.  
  17.         this.Page.Unloaded += (sender, e) => 
  18.         { 
  19. WINDOWS_PHONE_APP 
  20.             Windows.Phone.UI.Input.HardwareButtons.BackPressed -= HardwareButtons_BackPressed; 
  21.  
  22. if 
  23.         }; 
  24.     } 
  25.  
  26.     #region Navigation support 
  27.  
  28.         RelayCommand _goBackCommand; 
  29.         RelayCommand _goForwardCommand; 
  30.  
  31.         public RelayCommand GoBackCommand 
  32.         { 
  33.             get 
  34.             { 
  35.                 if (_goBackCommand == null
  36.                 { 
  37.                     _goBackCommand = new RelayCommand( 
  38.                         () => this.GoBack(), 
  39.                         () => this.CanGoBack()); 
  40.                 } 
  41.                 return _goBackCommand; 
  42.             } 
  43.             set 
  44.             { 
  45.                 _goBackCommand = value; 
  46.             } 
  47.         } 
  48.  
  49.         public RelayCommand GoForwardCommand 
  50.         { 
  51.             get 
  52.             { 
  53.                 if (_goForwardCommand == null
  54.                 { 
  55.                     _goForwardCommand = new RelayCommand( 
  56.                         () => this.GoForward(), 
  57.                         () => this.CanGoForward()); 
  58.                 } 
  59.                 return _goForwardCommand; 
  60.             } 
  61.         } 
  62.  
  63.         public virtual bool CanGoBack() 
  64.         { 
  65.             return this.Frame != null && this.Frame.CanGoBack; 
  66.         } 
  67.  
  68.         public virtual bool CanGoForward() 
  69.         { 
  70.             return this.Frame != null && this.Frame.CanGoForward; 
  71.         } 
  72.  
  73.         public virtual void GoBack() 
  74.         { 
  75.             if (this.Frame != null && this.Frame.CanGoBack) this.Frame.GoBack(); 
  76.         } 
  77.  
  78.         public virtual void GoForward() 
  79.         { 
  80.             if (this.Frame != null && this.Frame.CanGoForward) this.Frame.GoForward(); 
  81.         } 
  82.  
  83. #if WINDOWS_PHONE_APP 
  84.         private void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e) 
  85.         { 
  86.             if (this.GoBackCommand.CanExecute(null)) 
  87.             { 
  88.                 e.Handled = true
  89.                 this.GoBackCommand.Execute(null); 
  90.             } 
  91.         } 
  92. #else 
  93.         private void CoreDispatcher_AcceleratorKeyActivated(CoreDispatcher sender, 
  94.             AcceleratorKeyEventArgs e) 
  95.         { 
  96.             var virtualKey = e.VirtualKey; 
  97.  
  98.             if ((e.EventType == CoreAcceleratorKeyEventType.SystemKeyDown || 
  99.                 e.EventType == CoreAcceleratorKeyEventType.KeyDown) && 
  100.                 (virtualKey == VirtualKey.Left || virtualKey == VirtualKey.Right || 
  101.                 (int)virtualKey == 166 || (int)virtualKey == 167)) 
  102.             { 
  103.                 var coreWindow = Window.Current.CoreWindow; 
  104.                 var downState = CoreVirtualKeyStates.Down; 
  105.                 bool menuKey = (coreWindow.GetKeyState(VirtualKey.Menu) & downState) == downState; 
  106.                 bool controlKey = (coreWindow.GetKeyState(VirtualKey.Control) & downState) == downState; 
  107.                 bool shiftKey = (coreWindow.GetKeyState(VirtualKey.Shift) & downState) == downState; 
  108.                 bool noModifiers = !menuKey && !controlKey && !shiftKey; 
  109.                 bool onlyAlt = menuKey && !controlKey && !shiftKey; 
  110.  
  111.                 if (((int)virtualKey == 166 && noModifiers) || 
  112.                     (virtualKey == VirtualKey.Left && onlyAlt)) 
  113.                 { 
  114.                     e.Handled = true
  115.                     this.GoBackCommand.Execute(null); 
  116.                 } 
  117.                 else if (((int)virtualKey == 167 && noModifiers) || 
  118.                     (virtualKey == VirtualKey.Right && onlyAlt)) 
  119.                 { 
  120.                     e.Handled = true
  121.                     this.GoForwardCommand.Execute(null); 
  122.                 } 
  123.             } 
  124.         } 
  125.  
  126.         private void CoreWindow_PointerPressed(CoreWindow sender, 
  127.             PointerEventArgs e) 
  128.         { 
  129.             var properties = e.CurrentPoint.Properties; 
  130.  
  131.             if (properties.IsLeftButtonPressed || properties.IsRightButtonPressed || 
  132.                 properties.IsMiddleButtonPressed) return
  133.  
  134.             bool backPressed = properties.IsXButton1Pressed; 
  135.             bool forwardPressed = properties.IsXButton2Pressed; 
  136.             if (backPressed ^ forwardPressed) 
  137.             { 
  138.                 e.Handled = true
  139.                 if (backPressed) this.GoBackCommand.Execute(null); 
  140.                 if (forwardPressed) this.GoForwardCommand.Execute(null); 
  141.             } 
  142.         } 
  143. #endif 
  144.  
  145.         #endregion 
  146.  
  147.     #region Process lifetime management 
  148.  
  149.         private String _pageKey; 
  150.         public event LoadStateEventHandler LoadState; 
  151.         public event SaveStateEventHandler SaveState; 
  152.  
  153.         public void OnNavigatedTo(NavigationEventArgs e) 
  154.         { 
  155.             var frameState = SuspensionManager.SessionStateForFrame(this.Frame); 
  156.             this._pageKey = "Page-" + this.Frame.BackStackDepth; 
  157.  
  158.             if (e.NavigationMode == NavigationMode.New) 
  159.             { 
  160.                 var nextPageKey = this._pageKey; 
  161.                 int nextPageIndex = this.Frame.BackStackDepth; 
  162.                 while (frameState.Remove(nextPageKey)) 
  163.                 { 
  164.                     nextPageIndex++; 
  165.                     nextPageKey = "Page-" + nextPageIndex; 
  166.                 } 
  167.  
  168.                 if (this.LoadState != null
  169.                 { 
  170.                     this.LoadState(thisnew LoadStateEventArgs(e.Parameter, null)); 
  171.                 } 
  172.             } 
  173.             else 
  174.             { 
  175.                 if (this.LoadState != null
  176.                 { 
  177.                     this.LoadState(thisnew LoadStateEventArgs(e.Parameter, (Dictionary<String, Object>)frameState[this._pageKey])); 
  178.                 } 
  179.             } 
  180.         } 
  181.  
  182.         public void OnNavigatedFrom(NavigationEventArgs e) 
  183.         { 
  184.             var frameState = SuspensionManager.SessionStateForFrame(this.Frame); 
  185.             var pageState = new Dictionary<String, Object>(); 
  186.             if (this.SaveState != null
  187.             { 
  188.                 this.SaveState(thisnew SaveStateEventArgs(pageState)); 
  189.             } 
  190.             frameState[_pageKey] = pageState; 
  191.         } 
  192.  
  193.         #endregion 
  194.  
  195.  
  196. public delegate void LoadStateEventHandler(object sender, LoadStateEventArgs e); 
  197. public delegate void SaveStateEventHandler(object sender, SaveStateEventArgs e); 
  198.  
  199. public class LoadStateEventArgs : EventArgs 
  200.     public Object NavigationParameter { get; private set; } 
  201.     public Dictionary<string, Object> PageState { get; private set; } 
  202.  
  203.     public LoadStateEventArgs(Object navigationParameter, Dictionary<string, Object> pageState) 
  204.         : base() 
  205.     { 
  206.         this.NavigationParameter = navigationParameter; 
  207.         this.PageState = pageState; 
  208.     } 
  209.  
  210. public class SaveStateEventArgs : EventArgs 
  211.     public Dictionary<string, Object> PageState { get; private set; } 
  212.     public SaveStateEventArgs(Dictionary<string, Object> pageState) 
  213.         : base() 
  214.     { 
  215.         this.PageState = pageState; 
  216.     } 
#p#

四、OnResuming

既然在 OnSuspending 和 SaveState 方法中保存了必要數(shù)據(jù),就可以在 OnResuming 和 LoadState 方法中獲取之前保存的數(shù)據(jù)

  1. void OnResuming(object sender, object e) 
  2.     Data.Value += this.CalculateOffsetTimeInDecimalSeconds(this.suspensionTime); 
  1. private void NavigationHelper_LoadState(object sender, LoadStateEventArgs e) 
  2.     if ((e.PageState != null) && e.PageState.ContainsKey("isEditing")) 
  3.     { 
  4.         this.viewModel.SetEditMode(); 
  5.         this.viewModel.DataItem.Title = e.PageState["currentText"] as string; 
  6.     } 

五、OnLaunched

首先,在 OnLaunched 方法中可以通過 e.PreviousExecutionState 了解到應(yīng)用之前的狀態(tài)。

狀態(tài)包括:

(1)CloseByUser:被用戶主動(dòng)在多任務(wù)界面中關(guān)閉

(2)NotRunning:沒有啟動(dòng)過

(3)Running:?jiǎn)?dòng)中

(4)Terminated:掛起狀態(tài)時(shí)因內(nèi)存不足被系統(tǒng)終止

(5)Suspended:掛起狀態(tài)

因此,可以通過對(duì)此的判斷,根據(jù)不同情況處理應(yīng)用:

  1. protected async override void OnLaunched(LaunchActivatedEventArgs e) 
  2.   Frame rootFrame = Window.Current.Content as Frame; 
  3.  
  4.   if (rootFrame == null
  5.   { 
  6.     rootFrame = new Frame(); 
  7.  
  8.     SuspensionManager.RegisterFrame(rootFrame, "AppFrame"); 
  9.  
  10.     rootFrame.Language = Windows.Globalization.ApplicationLanguages.Languages[0]; 
  11.  
  12.     if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) 
  13.     { 
  14.       try 
  15.       { 
  16.         await SuspensionManager.RestoreAsync(); 
  17.       } 
  18.       catch (SuspensionManagerException) 
  19.       { 
  20.       } 
  21.     } 
  22.  
  23.     Window.Current.Content = rootFrame; 
  24.   } 
  25.  
  26.   if (rootFrame.Content == null
  27.   { 
  28.     rootFrame.Navigate(typeof(MainPage), e.Arguments); 
  29.   } 
  30.  
  31.   Window.Current.Activate(); 

六、注意

以上的方法盡量使用異步操作,不要進(jìn)行大量的復(fù)雜操作

 本文鏈接:http://www.cnblogs.com/xiaoshi3003/p/3752895.html

責(zé)任編輯:chenqingxiang 來源: cnblogs
相關(guān)推薦

2013-07-31 14:50:32

Windows PhoWP應(yīng)用程序生命周期

2013-08-01 09:40:51

Windows 8.1

2012-05-28 15:37:20

WP程序生命周期

2012-06-20 10:29:16

敏捷開發(fā)

2015-07-09 15:42:48

ios應(yīng)用生命周期

2015-07-08 16:28:23

weak生命周期

2013-12-13 09:47:23

2014-07-11 11:09:10

App應(yīng)用程序生命周期

2011-08-10 16:50:10

iPhone生命周期

2023-04-19 07:50:59

?云原生生命周期管理

2009-06-24 10:34:39

JSF生命周期JSF應(yīng)用程序

2011-07-20 15:58:58

iPhone 應(yīng)用程序 生命周期

2009-06-24 10:47:55

JSF生命周期

2013-08-19 17:03:00

.Net生命周期對(duì)象

2021-07-19 05:52:29

網(wǎng)絡(luò)生命周期網(wǎng)絡(luò)框架

2013-09-26 11:20:34

Informatica

2012-12-04 10:02:03

2022-04-19 07:20:24

軟件開發(fā)安全生命周期SSDLC應(yīng)用安全

2023-10-07 00:05:07

2012-02-21 10:01:04

微軟生命周期
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)