Windows10開発-ライフサイクル
歴史的に、Windowsには、ユーザーが複数のアプリケーションを同時に実行できる環境があります。ユーザーは異なるアプリケーションを簡単に切り替えることができます。このモデルは、使用法が通常単一アプリケーションに焦点を合わせている電話またはタブレットデバイスにはうまく機能しません。
Windows 8ストアアプリケーションプログラマーが直面する最も重要な課題の1つは、アプリケーションのライフサイクルを管理および理解することです。Windows Phoneアプリケーションを構築している場合、これの多くはおなじみでしょう。
Windows 8では、オペレーティングシステムがアプリケーションの存続期間を管理し、ユーザーはアプリケーションを終了できますが、通常、ユーザーは実行中のアプリケーションを意識的に終了せずに新しいアプリケーションを開きます。
Windows 10用のユニバーサルWindowsプラットフォーム(UWP)はこれらの問題に対処し、デスクトップユーザーにいくつかの優れた機能を提供して、複数のアプリケーションを複数のウィンドウエクスペリエンスで実行できるようにします。
Windowsアプリケーションは、以下に示すように、基本レベルで3つの状態で存在できます。
Running
Suspended
Terminate
ユーザーがアプリケーションを起動/アクティブ化すると、そのアプリケーションは running 状態。
ユーザーがアプリケーションを使用せず、フォアグラウンドに存在しなくなった場合、アプリケーションを一時停止できます。
一時停止状態から、アプリケーションはそのアプリケーションを再開するか、システムリソースを再利用するためにOSを終了することができます。
プロセス状態の遷移
実行中のアプリケーションのプロセス状態の遷移を理解することが重要です。ユーザーが最初にアプリケーションを起動すると、スプラッシュ画面が表示され、アプリケーションの実行が開始されます。
このプロセスは次のように説明できます-
アプリケーションが一時停止しているとき、アプリはその一時停止されたイベントを処理するために5秒を取得します。
アプリケーションが一時停止されると、コードはまったく実行されず、リソースは割り当てられません。
再開すると、再開したことがアプリに通知されます。一時停止状態から来ている場合は、何もする必要はありません。
メモリ不足により、アプリケーションが終了する可能性があります。
その時点では通知されないことに注意してください。そのため、保存を行う場合は、アプリケーションが一時停止状態になったときに行う必要があります。
アプリケーションがの間を行き来するとき Running そして Suspended 状態、それぞれイベントの一時停止と再開を起動します。
場合によっては、データを保存する必要があります。次に、以下に示すように非同期メソッドを呼び出す必要があります。
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 メニュー。
これで、保存された情報がローカル設定から取得され、アプリケーションが一時停止されたのと同じ状態で再開されることがわかります。