Xamarin.Forms App Lifecycle のチュートリアル
このチュートリアルを試行する前に、以下を正常に完了しておく必要があります。
- 初めての Xamarin.Forms アプリのビルドに関するクイックスタート。
- StackLayout のチュートリアル。
- Entry のチュートリアル。
このチュートリアルでは、以下の内容を学習します。
- 開始中、休止中、または再開中のアプリケーションに応答する。
- ライフサイクルの状態変化をまたいでデータを保持する。
ライフサイクルの状態変化をまたいでデータを保存する方法を示す簡単なアプリケーションを作成するには、Visual Studio 2019 または Visual Studio for Mac を使用します。 次のスクリーンショットは、最終的なアプリケーションです。
ライフサイクルの状態変化に応答する
このチュートリアルを完了するには、 .NET によるモバイル開発ワークロードがインストールされた、Visual Studio 2019 (最新リリース) が必要です。 さらに、iOS でチュートリアル アプリケーションを構築するには、ペアリング済みの Mac が必要になります。 Xamarin プラットフォームのインストールについては、「Xamarin のインストール」を参照してください。 Mac ビルド ホストへの Visual Studio 2019 の接続については、「Xamarin.iOS 開発のために Mac とペアリングする」を参照してください。
Visual Studio を起動し、AppLifecycleTutorial という名前の新しい空の Xamarin.Forms アプリを作成します。
重要
このチュートリアルの C# スニペットと XAML スニペットでは、AppLifecycleTutorial という名前のソリューションが必要です。 別の名前を使用すると、コードをこのチュートリアルからソリューションにコピーするときに、ビルド エラーが発生します。
作成される .NET Standard ライブラリの詳細については、Xamarin.Forms クイック スタート Deep Dive の「Xamarin.Forms アプリケーションの構造」を参照してください。
ソリューション エクスプローラーの [AppLifecycleTutorial] プロジェクトで、[App.xaml] を展開し、[App.xaml.cs] をダブルクリックして開きます。 次に、以下のように [App.xaml.cs] で、
OnStart
、OnSleep
、およびOnResume
のオーバーライドを更新します。protected override void OnStart() { Console.WriteLine("OnStart"); } protected override void OnSleep() { Console.WriteLine("OnSleep"); } protected override void OnResume() { Console.WriteLine("OnResume"); }
このコードでは、各メソッドが呼び出されたタイミングを示す
Console.WriteLine
ステートメントで、アプリケーションのライフサイクル メソッドのオーバーライドを更新します。OnStart
メソッドは、アプリケーションの起動時に呼び出されます。OnSleep
メソッドは、アプリケーションがバックグラウンドに移行したときに呼び出されます。OnResume
メソッドは、アプリケーションがバックグラウンドから再開したときに呼び出されます。
Note
アプリケーションの終了のメソッドはありません。 通常の状況では、アプリケーションの終了は
OnSleep
メソッドから発生します。Visual Studio ツール バーで、 [開始] ボタン ([再生] ボタンに似た三角形のボタン) を押し、選択したリモート iOS シミュレーターまたは Android エミュレーター内でアプリケーションを起動します。 アプリケーションが起動すると、
OnStart
メソッドが呼び出され、OnStart が Visual Studio の [出力] ウィンドウに出力されます。[Mono] Found as 'java_interop_jnienv_get_object_array_element'. OnStart [OpenGLRenderer] HWUI GL Pipeline
(iOS または Android では [ホーム] ボタンをタップすることで) アプリケーションがバックグラウンド化されたときに、
OnSleep
メソッドが呼び出されます。[EGL_emulation] eglMakeCurrent: 0x83ee2920: ver 3 0 (tinfo 0x8357eff0) OnSleep [Mono] Image addref System.Runtime.Serialization[0x83ee19c0] -> System.Runtime.Serialization.dll[0x83f57b00]: 2
その後、アプリケーションがバックグラウンドから再開した (iOS ではアプリケーション アイコンをタップし、Android では [概要] ボタンをタップして AppLifecycleTutorial アプリケーションを選択した) ときに、
OnResume
メソッドが呼び出されます。Thread finished: <Thread Pool> #5 OnResume [EGL_emulation] eglMakeCurrent: 0x83ee2920: ver 3 0 (tinfo 0x8357eff0)
Note
これらのコード ブロックは、Android でアプリケーションを実行した場合の出力例を示しています。
Visual Studio で、アプリケーションを停止します。
Xamarin.Forms アプリのライフサイクルの詳細については、「Xamarin.Forms アプリのライフサイクル」を参照してください。
ライフサイクルの状態変化をまたいでデータを保持する
Application
サブクラスには、ライフサイクルの状態の変化を通してデータを格納するために使用できる静的 Properties
ディクショナリがあります。 このディクショナリでは、string
キーが使用され、object
値が格納されます。 このディクショナリはデバイスに自動的に保存され、アプリケーションの再起動時にデータが再作成されます。
重要
Properties
ディクショナリでは、ストレージ用のプリミティブ型のみをシリアル化できます。
この演習では、バックグラウンド処理時に Entry
のテキストを保持し、アプリケーションの再起動時にテキストを Entry
に復元するようにアプリケーションを変更します。
ソリューション エクスプローラーの [AppLifecycleTutorial] プロジェクトで、 [App.xaml] を展開し、 [App.xaml.cs] をダブルクリックして開きます。 次に、App.xaml.cs のテンプレート コードをすべて削除し、次のコードに置き換えます。
using System; using Xamarin.Forms; namespace AppLifecycleTutorial { public partial class App : Application { const string displayText = "displayText"; public string DisplayText { get; set; } public App() { InitializeComponent(); MainPage = new MainPage(); } protected override void OnStart() { Console.WriteLine("OnStart"); if (Properties.ContainsKey(displayText)) { DisplayText = (string)Properties[displayText]; } } protected override void OnSleep() { Console.WriteLine("OnSleep"); Properties[displayText] = DisplayText; } protected override void OnResume() { Console.WriteLine("OnResume"); } } }
このコードは
DisplayText
プロパティとdisplayText
定数を定義します。 アプリケーションがバックグラウンド化されるか終了すると、OnSleep
メソッドのオーバーライドはdisplayText
のキーに対してDisplayText
プロパティ値をProperties
ディクショナリに追加します。 その後、Properties
ディクショナリにdisplayText
キーが含まれていれば、アプリケーションの起動時にそのキーの値がDisplayText
プロパティに復元されます。重要
予期しないエラーを防ぐために、必ず
Properties
ディクショナリでキーが存在することを確認してからアクセスしてください。OnResume
メソッドのオーバーロードでProperties
ディクショナリからデータを復元する必要はありません。 これは、アプリケーションがバックグラウンド化されても、アプリケーションとその状態はまだメモリに保持されているためです。ソリューション エクスプローラーの AppLifecycleTutorial プロジェクトで、 [MainPage.xaml] をダブルクリックして開きます。 次に、 [MainPage.xaml] のテンプレート コードをすべて削除し、次のコードに置き換えます。
<?xml version="1.0" encoding="utf-8"?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="AppLifecycleTutorial.MainPage"> <StackLayout Margin="20,35,20,20"> <Entry x:Name="entry" Placeholder="Enter text here" Completed="OnEntryCompleted" /> </StackLayout> </ContentPage>
このコードでは、
StackLayout
の中のEntry
から構成されるページのユーザー インターフェイスを宣言によって定義します。Entry.Placeholder
プロパティは、Entry
が最初に表示されたときに表示されるプレースホルダー テキストを指定し、OnEntryCompleted
という名前のイベント ハンドラーがCompleted
イベントに登録されます。 また、Entry
にはx:Name
属性で指定された名前があります。 これにより、分離コード ファイルは、割り当てられた名前を使用してEntry
オブジェクトにアクセスできます。ソリューション エクスプローラーの AppLifecycleTutorial プロジェクトで [MainPage.xaml] を展開し、 [MainPage.xaml.cs] をダブルクリックして開きます。 次に、MainPage.xaml.cs で、
OnAppearing
メソッドのオーバーライドとOnEntryCompleted
イベント ハンドラーをクラスに追加します。protected override void OnAppearing() { base.OnAppearing(); entry.Text = (Application.Current as App).DisplayText; } void OnEntryCompleted(object sender, EventArgs e) { (Application.Current as App).DisplayText = entry.Text; }
OnAppearing
メソッドはApp.DisplayText
プロパティの値を取得し、それをEntry
のText
プロパティ値として設定します。Note
OnAppearing
メソッドのオーバーライドは、ContentPage
がレイアウトされた後、それが表示される直前に実行されます。 したがって、これは Xamarin.Forms ビューのコンテンツを設定するのに適した場所です。テキストが
Entry
で終了したら、Return キーでOnEntryCompleted
メソッドを実行します。Entry
テキストがApp.DisplayText
プロパティに格納されます。Visual Studio ツール バーで、 [開始] ボタン ([再生] ボタンに似た三角形のボタン) を押し、選択したリモート iOS シミュレーターまたは Android エミュレーター内でアプリケーションを起動します。
Entry
にテキストを入力してReturn キーを押します。 次に、[ホーム] ボタンをタップしてOnSleep
メソッドを呼び出してアプリケーションをバックグラウンドにします。Visual Studio で、アプリケーションを停止してからもう一度起動すると、以前に
Entry
に入力されたテキストが復元されます。Visual Studio で、アプリケーションを停止します。
Properties ディクショナリへのデータの永続化の詳細については、「Xamarin.Forms の App クラス」ガイドの「Properties ディクショナリ」を参照してください。
おめでとうございます。
これでこのチュートリアルは完了です。ここでは以下の方法を学習しました。
- 開始中、休止中、または再開中のアプリケーションに応答する。
- ライフサイクルの状態変化をまたいでデータを保持する。
次の手順
Xamarin.Forms を使用してモバイル アプリケーションを作成する基本についてさらに学習する場合は、Local Database のチュートリアルに進んでください。
関連リンク
このセクションに問題がある場合 このセクションを改善できるよう、フィードバックをお送りください。