Windows 10 개발-수명주기

역사적으로 Windows에는 사용자가 여러 응용 프로그램을 동시에 실행할 수있는 환경이 있습니다. 사용자는 다른 애플리케이션간에 쉽게 전환 할 수 있습니다. 이 모델은 사용이 일반적으로 단일 애플리케이션에 초점을 맞춘 휴대폰 또는 태블릿 장치에서는 제대로 작동하지 않습니다.

Windows 8 Store 응용 프로그램 프로그래머가 직면 한 가장 중요한 과제 중 하나는 응용 프로그램 수명주기를 관리하고 이해하는 것입니다. Windows Phone 애플리케이션을 빌드했다면이 중 대부분이 익숙 할 것입니다.

  • Windows 8에서는 운영 체제가 응용 프로그램의 수명을 관리하고 사용자가 응용 프로그램을 종료 할 수 있지만 일반적으로 사용자는 실행중인 응용 프로그램을 의식적으로 종료하지 않고 새 응용 프로그램을 엽니 다.

  • Windows 10 용 UWP (유니버설 Windows 플랫폼)는 이러한 문제를 해결하여 데스크톱 사용자에게 몇 가지 멋진 기능을 제공하여 여러 응용 프로그램이 다중 창 환경에서 실행될 수 있도록합니다.

Windows 응용 프로그램은 아래와 같이 기본 수준에서 세 가지 상태로 존재할 수 있습니다.

  • Running

  • Suspended

  • Terminate

  • 사용자가 애플리케이션을 시작 / 활성화하면 running 상태.

  • 사용자가 응용 프로그램을 사용하지 않고 더 이상 포 그라운드에 있지 않으면 응용 프로그램을 일시 중지 할 수 있습니다.

  • Suspended 상태에서 애플리케이션은 시스템 리소스를 회수하기 위해 해당 애플리케이션을 재개하거나 OS를 종료 할 수 있습니다.

프로세스 상태 전환

실행중인 응용 프로그램에서 프로세스 상태 전환을 이해하는 것이 중요합니다. 사용자가 처음 애플리케이션을 시작하면 스플래시 화면이 표시되고 애플리케이션이 실행되기 시작합니다.

프로세스는 다음과 같이 설명 할 수 있습니다.

  • 애플리케이션이 일시 중지되면 앱에서 일시 중지 된 이벤트를 처리하는 데 5 초가 걸립니다.

  • 응용 프로그램이 일시 중단되면 코드가 실행되지 않고 리소스가 할당되지 않습니다.

  • 재개되면 재개되었다는 알림이 앱에 표시됩니다. 일시 중지 상태에서 오는 경우 조치를 취할 필요가 없습니다.

  • 메모리 부족으로 인해 애플리케이션이 종료 될 수 있습니다.

  • 이 시점에서 알림을받지 못하므로 저장하는 경우 일시 중단 된 응용 프로그램 상태가 될 때해야합니다.

응용 프로그램이 사이를 오가는 경우 RunningSuspended 상태, 화재 일시 중지 및 재개 이벤트 각각.

때로는 데이터를 저장해야합니다. 그런 다음 아래와 같이 비동기 메서드를 호출해야합니다.

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 # 코드입니다. 현재 데이터는suspend event 로컬 설정에서 데이터가 검색됩니다. resume event 아래와 같이 로컬 설정에서.

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); 
         } 
      } 
   } 
}

위의 코드를 컴파일하고 실행하면 다음과 같은 창이 나타납니다. 이제 원하는 정보를 작성하십시오.

우리가 가자 Lifecycle 이벤트 드롭 다운 메뉴를 선택하고 suspended. 이제 응용 프로그램이 일시 중지되고 원하는 정보가 로컬 설정에 저장됩니다. 아래 스크린 샷을 참조하십시오.

이제 응용 프로그램을 재개하려면 옵션을 선택하십시오. Resume ~로부터 Lifecycle Events 메뉴.

이제 저장된 정보가 로컬 설정에서 검색되고 응용 프로그램이 일시 중단 된 동일한 상태에서 다시 시작되는 것을 볼 수 있습니다.