Windows 10 开发 - 生命周期


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

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

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

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

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

  • 跑步

  • 暂停

  • 终止

应用程序生命周期
  • 当用户启动/激活任何应用程序时,它就会进入运行状态。

  • 如果用户不使用应用程序并且它不再位于前台,则可以暂停应用程序。

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

进程状态转换

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

进程状态转换

该过程可以解释如下 -

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

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

  • 当它恢复时,应用程序会收到通知它已恢复。如果您处于暂停状态,则无需采取任何操作。

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

  • 请记住,此时您不会收到通知,因此您所做的任何保存都必须在进入暂停应用程序状态时进行。

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

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

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>

下面给出了实现 Suspend 和 Resume 事件的 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); 
         } 
      } 
   } 
}

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

编译执行

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

生命周期事件

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

生命周期事件菜单

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

生命周期检索