Xamarin.Forms の App クラス

Application 基底クラスでは、プロジェクトの既定の App サブクラスで公開される次の機能が提供されています。

  • アプリの最初のページが設定される MainPage プロパティ。
  • ライフサイクルの状態変化をまたいでシンプルな値を格納するための永続的な Properties ディクショナリ
  • 現在のアプリケーション オブジェクトへの参照が含まれている静的な Current プロパティ。

また、OnStartOnSleepOnResume などのライフサイクル メソッドと、モーダル ナビゲーション イベントも公開されています。

選択するテンプレートに応じて、2 つの方法のいずれかで App クラスを定義できます。

  • C#
  • XAML と C#

XAML を使用して App クラスを作成するには、次のコード例に示すように、既定の App クラスを、XAML の App クラスとそれに関連する分離コードに置き換える必要があります。

<Application xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Photos.App">

</Application>

次のコード例では、関連する分離コードを示します。

public partial class App : Application
{
    public App ()
    {
        InitializeComponent ();
        MainPage = new HomePage ();
    }
    ...
}

MainPage プロパティの設定だけでなく、分離コードで InitializeComponent メソッドを呼び出して、関連付けられている XAML を読み込んで解析する必要があります。

MainPage プロパティ

Application クラスの MainPage プロパティでは、アプリケーションのルート ページが設定されます。

たとえば、ユーザーがログインしているかログアウトしているかに応じて異なるページを表示するためのロジックを、App クラス内に作成することができます。

MainPage プロパティは、App のコンストラクターで設定する必要があります。

public class App : Xamarin.Forms.Application
{
    public App ()
    {
        MainPage = new ContentPage { Title = "App Lifecycle Sample" }; // your page here
    }
}

Properties ディクショナリ

Application サブクラスには静的な Properties ディクショナリがあり、データの格納に使用できます。具体的には、OnStartOnSleep、および OnResume メソッドで使用するためのデータです。 これには、Application.Current.Properties を使用して Xamarin.Forms コード内のどこからでもアクセスできます。

Properties ディクショナリでは、string キーが使用され、object 値が格納されます。

たとえば、次のように、永続的な "id" プロパティをコードの任意の場所で設定できます (項目が選択されるとき、ページの OnDisappearing メソッド内、または OnSleep メソッド内)。

Application.Current.Properties ["id"] = someClass.ID;

その後、OnStart または OnResume メソッドで、この値を使用して何らかの方法でユーザーのエクスペリエンスを再作成できます。 Properties ディクショナリには object が格納されるので、使用する前にその値をキャストする必要があります。

if (Application.Current.Properties.ContainsKey("id"))
{
    var id = Application.Current.Properties ["id"] as int;
    // do something with id
}

予期しないエラーを防ぐため、常に、アクセスする前にキーの存在を確認します。

Note

Properties ディクショナリでは、ストレージ用のプリミティブ型のみをシリアル化できます。 他の型 (List<string> など) を格納しようとすると、明示されずに失敗する可能性があります。

永続化

Properties ディクショナリは、デバイスに自動的に保存されます。 ディクショナリに追加されたデータは、アプリケーションがバックグラウンドから戻るときに、または再起動後でも利用できます。

Xamarin.Forms 1.4 では、Application クラスに追加メソッド SavePropertiesAsync() が導入されました。このメソッドを呼び出すと、Properties ディクショナリを事前に保存できます。 これにより、クラッシュまたは OS による強制終了のためにプロパティがシリアル化されないリスクなしに、重要な更新後にプロパティを保存できます。

辞書の使用に関するリファレンスは、書籍を使用Propertiesしたモバイル アプリXamarin.Formsの作成 (第 6 章、15 章、20 章を参照) と関連するサンプルにあります。

Application クラス

参考のため、完全な Application クラスの実装を次に示します。

public class App : Xamarin.Forms.Application
{
    public App ()
    {
        MainPage = new ContentPage { Title = "App Lifecycle Sample" }; // your page here
    }

    protected override void OnStart()
    {
        // Handle when your app starts
        Debug.WriteLine ("OnStart");
    }

    protected override void OnSleep()
    {
        // Handle when your app sleeps
        Debug.WriteLine ("OnSleep");
    }

    protected override void OnResume()
    {
        // Handle when your app resumes
        Debug.WriteLine ("OnResume");
    }
}

このクラスは、各プラットフォーム固有プロジェクトでインスタンス化されて、LoadApplication メソッドに渡されます。このメソッドでは、MainPage が読み込まれて、ユーザーに表示されます。 以下のセクションでは、各プラットフォームのコードを示します。 最新の Xamarin.Forms ソリューション テンプレートには、アプリ用に事前構成されたこのすべてのコードが既に含まれます。

iOS プロジェクト

iOS の AppDelegate クラスは、FormsApplicationDelegate を継承します。 次のようになります。

  • App クラスのインスタンスを使用して LoadApplication を呼び出します。

  • 常に base.FinishedLaunching (app, options); を返します。

[Register ("AppDelegate")]
public partial class AppDelegate :
    global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate // superclass new in 1.3
{
    public override bool FinishedLaunching (UIApplication app, NSDictionary options)
    {
        global::Xamarin.Forms.Forms.Init ();

        LoadApplication (new App ());  // method is new in 1.3

        return base.FinishedLaunching (app, options);
    }
}

Android プロジェクト

Android の MainActivity は、FormsAppCompatActivity を継承します。 OnCreate のオーバーライド内で、App クラスのインスタンスを使用して LoadApplication メソッドが呼び出されます。

[Activity (Label = "App Lifecycle Sample", Icon = "@drawable/icon", Theme = "@style/MainTheme", MainLauncher = true,
    ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : FormsAppCompatActivity
{
    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);

        global::Xamarin.Forms.Forms.Init (this, bundle);

        LoadApplication (new App ()); // method is new in 1.3
    }
}

Windows 10 用のユニバーサル Windows プロジェクト (UWP)

UWP プロジェクトのメイン ページでは、WindowsPage を継承する必要があります。

<forms:WindowsPage
   ...
   xmlns:forms="using:Xamarin.Forms.Platform.UWP"
   ...>
</forms:WindowsPage>

C# コードビハインド構築LoadApplicationXamarin.FormsAppでは、.. UWP アプリケーションにも Xamarin.Forms と関係のない独自の App クラスがあるため、アプリケーションの名前空間を使用して App を明示的に修飾するのがよい方法であることに注意してください。

public sealed partial class MainPage
{
    public MainPage()
    {
        InitializeComponent();

        LoadApplication(new YOUR_NAMESPACE.App());
    }
 }

UWP プロジェクトの App.xaml.cs から Forms.Init() を呼び出す必要があることに注意してください。

詳細については、「Setup Windows Projects」(Windows プロジェクトのセットアップ) を参照してください。UWP をターゲットにしていない既存の Xamarin.Forms ソリューションに UWP プロジェクトを追加する手順が説明されています。

他の Xamarin ビデオは、Channel 9 および YouTube でご覧いただけます。