Windows10-development-lifecycle
Windows 10開発-ライフサイクル
歴史的に、Windowsには、ユーザーが複数のアプリケーションを同時に実行できる環境があります。 ユーザーは異なるアプリケーションを簡単に切り替えることができます。 このモデルは、使用が通常単一のアプリケーションに集中している電話またはタブレットデバイスではうまく機能しません。
Windows 8ストアアプリケーションプログラマが直面する最も重要な課題の1つは、アプリケーションのライフサイクルの管理と理解です。 Windows Phoneアプリケーションを構築している場合、その多くはおなじみでしょう。
- Windows 8では、オペレーティングシステムがアプリケーションのライフタイムを管理し、ユーザーはアプリケーションを終了できますが、通常、ユーザーは実行中のアプリケーションを意識的に終了することなく新しいアプリケーションを開きます。
- Windows 10用のユニバーサルWindowsプラットフォーム(UWP)はこれらの問題に対処し、デスクトップユーザーにいくつかの素晴らしい機能を提供し、複数のウィンドウエクスペリエンスで複数のアプリケーションを実行できるようにします。
Windowsアプリケーションは、以下に示すように、基本レベルで3つの状態で存在できます。
- ランニング
- 停止中
- 終了
- ユーザーがアプリケーションを起動/アクティブ化すると、アプリケーションは「実行中」状態になります。
- ユーザーが使用せず、フォアグラウンドになくなった場合、アプリケーションを中断できます。
- アプリケーションは、サスペンド状態からそのアプリケーションを再開するか、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>
以下に、サスペンドイベントとレジュームイベントが実装されるC#コードを示します。 現在のデータは、ローカル設定の* suspendイベント*に保存され、次に示すように、ローカル設定の* resumeイベント*で取得されます。
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 Events メニューから Resume オプションを選択します。
これで、保存された情報がローカル設定から取得され、アプリケーションが中断されたのと同じ状態で再開されることがわかります。