📜  Windows 10开发-生命周期

📅  最后修改于: 2020-11-18 10:11:14             🧑  作者: Mango


从历史上看,Windows具有一个环境,用户可以在该环境中同时运行多个应用程序。用户可以轻松地在不同的应用程序之间切换。该模型不适用于电话或平板电脑设备,这些设备的使用通常只针对单个应用程序。

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

  • 在Windows 8下,操作系统管理应用程序的生命周期,并且在用户可以终止应用程序的同时,通常用户在不自觉终止正在运行的应用程序的情况下打开新应用程序。

  • 适用于Windows 10的通用Windows平台(UWP)解决了这些问题,为桌面用户提供了一些不错的选择,从而使多个应用程序可以在多窗口体验下运行。

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

  • 跑步

  • 已暂停

  • 终止

应用生命周期

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

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

  • 从Suspended状态,应用程序可以恢复该应用程序或终止OS以便回收系统资源。

流程状态转换

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

流程状态转换

该过程可以解释如下-

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

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

  • 恢复时,将通知应用已恢复。如果您处于暂停状态,则无需采取任何措施。

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

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

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

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

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(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文件所示。

 
    
   
      
        
      
            
         
                
         
                
         
                
         
            
      
        
   
    

下面给出的是在其中实现Suspend和Resume事件的C#代码。当前数据将以本地设置存储在suspend事件中,然后在恢复事件中从本地设置检索数据,如下所示。

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

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

   ///  
      /// An empty page that can be used on its own or navigated to within a Frame. 
   ///  
    
   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(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(ref T storage, T value, 
         [CallerMemberName()]string propertyName = null){ 

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

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

编译执行

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

生命周期事件

现在,当您想要恢复应用程序时,请从Lifecycle Events菜单中选择Resume选项。

生命周期事件菜单

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

生命周期检索