Windows 10 开发 - 生命周期



历史上,Windows 拥有一个用户可以同时运行多个应用程序的环境。用户可以轻松地在不同的应用程序之间切换。这种模式对于通常专注于单一应用程序使用的手机或平板电脑设备并不适用。

Windows 8 应用商店应用程序程序员面临的最大挑战之一是管理和理解应用程序生命周期。如果您一直在构建 Windows 手机应用程序,那么其中很多内容您都会很熟悉。

  • 在 Windows 8 下,操作系统管理应用程序的生命周期,虽然用户可以终止应用程序,但通常用户会打开新的应用程序,而不会有意识地终止正在运行的应用程序。

  • Windows 10 的通用 Windows 平台 (UWP) 解决了这些问题,为桌面用户提供了一些很酷的功能,以便可以以多窗口体验运行多个应用程序。

Windows 应用程序在基本级别可以存在三种状态,如下所示。

  • 运行中

  • 挂起

  • 终止

App Lifecycle
  • 当用户启动/激活任何应用程序时,它将进入运行中状态。

  • 如果用户不使用应用程序并且它不再处于前台,则可以挂起应用程序。

  • 从挂起状态,应用程序可以恢复该应用程序或终止操作系统以回收系统资源。

进程状态转换

了解正在运行的应用程序中的进程状态转换非常重要。当用户首次启动应用程序时,将显示启动画面,然后应用程序开始运行。

Process State Transition

该过程可以解释如下:

  • 当应用程序挂起时,您的应用程序有五秒钟的时间来处理该挂起事件。

  • 当应用程序挂起时,绝对不会运行任何代码,也不会分配任何资源。

  • 恢复时,应用程序会收到已恢复的通知。如果您是从挂起状态恢复的,则无需执行任何操作。

  • 在内存压力下,您的应用程序可能会被终止。

  • 请记住,您不会在该点收到通知,因此您必须在进入挂起应用程序状态时执行任何保存操作。

当应用程序在运行中挂起状态之间来回转换时,分别触发挂起和恢复事件。

有时,您需要保存数据。然后,您必须调用异步方法,如下所示。

Application.Current.Suspending += new SuspendingEventHandler(App_Suspending); 

async void App_Suspending(Object sender, Windows.ApplicationModel.SuspendingEventArgs e){ 
   // Create a simple setting  
   localSettings.Values["FirstName"] = fName.Text; 
   localSettings.Values["LastName"] = lName.Text; 
   localSettings.Values["Email"] = email.Text; 
}

Application.Current.Resuming += new EventHandler<Object>(App_Resuming); 

private void App_Resuming(Object sender, Object e){ 
   fName.Text = localSettings.Values["FirstName"]; 
   lName.Text = localSettings.Values["LastName"]; 
   email.Text = localSettings.Values["Email"]; 
}

让我们研究一个示例,其中添加了控件,如下面的 XAML 文件所示。

<Page 
   x:Class = "UWPLifeCycleDemo.MainPage" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   xmlns:local = "using:UWPLifeCycleDemo" 
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008" 
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
   mc:Ignorable = "d"> 
    
   <Grid Background = "{ThemeResource ApplicationPageBackgroundThemeBrush}">
      <Hub Header = "Details" />
		
      <StackPanel VerticalAlignment = "Top" HorizontalAlignment = "Left" 
         Margin = "12,64,0,0">
			
         <TextBox Header = "First Name" Text = "{Binding FirstName, 
            Mode = TwoWay, UpdateSourceTrigger = PropertyChanged}" 
            Width = "200" />
				
         <TextBox Header = "Last Name" Text = "{Binding LastName, Mode = TwoWay, 
            UpdateSourceTrigger = PropertyChanged}" Width = "200" />
				
         <TextBox Header = "Email" Text = "{Binding Email, Mode = TwoWay, 
            UpdateSourceTrigger = PropertyChanged}" Width = "200" />
				
         <Button Margin = "0,12">Submit</Button>
			
      </StackPanel>
		
   </Grid>
	
</Page>

以下是实现了挂起和恢复事件的 C# 代码。当前数据将存储在本地设置中的挂起事件中,然后从本地设置中的恢复事件中检索数据,如下所示。

using System; 
using System.ComponentModel; 
using System.Runtime.CompilerServices; 

using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 
 
namespace UWPLifeCycleDemo {

   /// <summary> 
      /// An empty page that can be used on its own or navigated to within a Frame. 
   /// </summary> 
	
   public sealed partial class MainPage : Page{
      var localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; 
		
      public MainPage() {
         this.InitializeComponent(); 
         Application.Current.Suspending += new SuspendingEventHandler(App_Suspending); 
         Application.Current.Resuming += new EventHandler<Object>(App_Resuming); 
      } 
		
      async void App_Suspending(Object sender, Windows.ApplicationModel.SuspendingEventArgs e){
         
         // Create a simple setting 
         localSettings.Values["FirstName"] = fName.Text; 
         localSettings.Values["LastName"] = lName.Text; 
         localSettings.Values["Email"] = email.Text; 
      } 
		
      private void App_Resuming(Object sender, Object e){
         fName.Text = localSettings.Values["FirstName"]; 
         lName.Text = localSettings.Values["LastName"]; 
         email.Text = localSettings.Values["Email"]; 
      }
		
   } 
	
   public abstract class BindableBase : INotifyPropertyChanged {
      private string _FirstName = default(string);
		
      public string FirstName { 
         get { return _FirstName; } 
         set { Set(ref _FirstName, value); } 
      } 
		
      private string _LastName = default(string);
		
      public string LastName { 
         get { return _LastName; } 
         set { Set(ref _LastName, value); } 
      } 
		
      private string _Email = default(string);
		
      public string Email { 
         get { return _Email; } 
         set { Set(ref _Email, value); } 
      } 
		
      public event PropertyChangedEventHandler PropertyChanged;
		
      public void RaisePropertyChanged([CallerMemberName]string propertyName = null) {
         PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
      } 
		
      public void Set<T>(ref T storage, T value, 
         [CallerMemberName()]string propertyName = null){ 

         if (!object.Equals(storage, value)){
            storage = value; 
            RaisePropertyChanged(propertyName); 
         } 
      } 
   } 
}

编译并执行上述代码后,您将看到以下窗口。现在编写所需的信息。

Compile Execution

让我们转到生命周期事件下拉菜单并选择挂起。现在,您的应用程序将被挂起,所需信息将存储在本地设置中。请参见下图所示的屏幕截图。

Lifecycle Events

现在,当您想要恢复应用程序时,请从生命周期事件菜单中选择恢复选项。

Lifecycle Events Menu

现在您将看到从本地设置中检索到的存储信息,并且应用程序将从挂起时的相同状态恢复。

Lifecycle Retrive
广告
© . All rights reserved.