Xamarin逆引きTips

Xamarin逆引きTips

Xamarin.AndroidでApplicationクラスを拡張するには?

2014年12月24日

Applicationクラスを拡張すると、アプリケーションイベントの発生時に独自の処理を実行したり、アプリケーションオブジェクトに機能を追加したりできる。その基本的な実装方法を解説する。

奥山 裕紳(@amay077
  • このエントリーをはてなブックマークに追加

 ネイティブのAndroid開発では、アプリケーションが起動する時に生成されるApplicationクラスがあり、これを開発者が拡張して、独自の処理を行うことができる。

 今回は、Xamarin.Androidで、Applicationを拡張して使用する方法を解説する。

1. Applicationクラスを拡張したクラスの作成

 Applicationクラスを拡張したクラスを、以下のコードのように用意する。

C#
using System;
using Android.App;
using Android.Runtime;
using System.Diagnostics;

namespace ApplicationClassSample
{
  [Application]  //<--2
  public class MyApplication : Application //<--1
  {
    public MyApplication (IntPtr javaReference, JniHandleOwnership transfer)
    : base(javaReference, transfer)  //<--3
    {
    }

    public override void OnCreate()
    {
      base.OnCreate();

      Debug.WriteLine("MyApplication OnCreate called"); //<--4
    }
  }
}
Applicationクラスを拡張したクラス(MyApplication.cs)

 ここで作成するMyApplicationクラスは、Applicationクラス(Android.App名前空間)から派生させ(1)、さらに[Application]属性を付与する(2)。

 次に、これはJavaのオブジェクトであるので、3のようなコンストラクターを用意する。

 4は、アプリケーションが生成された時に、ログを出力する処理だ。

 1は、ネイティブのAndroid開発と同じであるが、23はXamarin.Android独自の手法だ。これらを忘れると、Applicationクラスとして認識されないので注意が必要だ。

 Xamarin.AndroidでApplicationクラスを拡張する手順はこれだけだ。ネイティブのAndroid開発では、AndroidManifest.xmlファイルへの記述が必要だが、Xamarin.Androidでは2で付与した属性がその代わりとなる。

 この状態で、アプリケーションを実行すると、図1のように、Xamarin Studioのアプリケーション出力に、ログが出力されるのが確認できる。

図1 アプリケーション起動時のログ

2. 拡張したアプリケーションクラスを参照する

 アプリケーションオブジェクト(=Applicationクラスのオブジェクト)の生存期間は、アプリケーション自体の生成から破棄までなので、画面に依存しないデータなどの保存に使用されることが多い。

 先ほどのMyApplicationクラスに少し書き足して、データを保存するGlobalDataプロパティを追加したのが、下のコードだ。

C#
……省略……

namespace ApplicationClassSample
{
  [Application]
  public class MyApplication : Application
  {
    // 追記ここから
    public string GlobalData
    {
      get;
      set;
    }
    // 追記ここまで

    public MyApplication (IntPtr javaReference, JniHandleOwnership transfer)
    : base(javaReference, transfer)
    {
    }

    ……省略……
  }
}
Applicationクラスを拡張したクラス(MyApplication.cs)

 Activity内で、MyApplicationオブジェクトを取得するには、以下のように記述する。

C#
……省略……

namespace ApplicationClassSample
{
  [Activity(Label = "ApplicationClassSample", MainLauncher = true, Icon = "@drawable/icon")]
  public class MainActivity : Activity
  {
    protected override void OnCreate(Bundle bundle)
    {
      base.OnCreate(bundle);

      ……省略……

      button.Click += delegate
      {
        var myapp = Application as MyApplication; //<--1
        if (myapp != null) {
          myapp.GlobalData = "my_gobal_data"; //<--2
        }
      };
    }
  }
}
MyApplicationオブジェクトをActivityのOnCreateメソッド内で取得するコード(MainActivity.cs)

 Activityクラスは、Applicationプロパティを持っており、これによりアプリケーションオブジェクトを取得できる。Applicationクラスが拡張されている場合は、拡張されたクラスのインスタンスが取得できるので、as演算子でMyApplicationにキャストする。通常のキャストでも構わないが、as演算子は、キャストに失敗すると(例外ではなく)nullを返すという機能を持つので、失敗時のコードがシンプルになる。

 MyApplicationオブジェクトが取得できれば、GlobalDataプロパティにアクセスできるので、データの入出力が可能だ。

まとめ

 Applicationクラスを拡張して独自の処理を行う方法として、アプリケーション起動時にログを出力する方法と、アプリケーションオブジェクトのプロパティにデータの保存を行う方法を解説した。ネイティブAndroidでの手法と少し異なる点があることに注意されたい。

 また、この手順は、Xamarinの公式サイトにも分かりやすい形で記述されていない(強いて挙げれば、以下に示すAndroidManifest.xmlと属性の関連について記述されたページだ)。

 筆者がこの手法について知ったのは、Stack Overflowに投稿された情報からだ。参考までにこちらも紹介しておきたい。

※以下では、本稿の前後を合わせて5回分(第29回~第33回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

29. Xamarin.iOS/Androidでアプリのデータディレクトリを取得するには?

アプリ固有のデータ領域のディレクトリパスを取得するため方法のうち、iOS/Androidで共通のコードの書き方を説明する。

30. Xamarin.iOS/Androidでアプリの設定情報を保存するには?

iOSのNSUserDefaultsやAndroidのSharedPreferenceではなく.NETのIsolatedStorageを使って、Xamarin.iOS/Androidでアプリの軽量データを保存する方法を解説する。

31. 【現在、表示中】≫ Xamarin.AndroidでApplicationクラスを拡張するには?

Applicationクラスを拡張すると、アプリケーションイベントの発生時に独自の処理を実行したり、アプリケーションオブジェクトに機能を追加したりできる。その基本的な実装方法を解説する。

32. Xamarin.iOSでZipファイルを使用するには?(ZipFileクラス編)

iOSアプリ開発標準のZipArchiveライブラリではなく、.NET標準のZipFileクラス編を使って、ZIPファイルの圧縮・展開を行う方法を解説する。

33. Xamarin Studio/Visual Studioで「Ricty Diminished」プログラミング用フォントを使うには?

「Ricty Diminished」や「Source Code Pro」などのプログラミング用フォントを、Xamarin Studio/Visual Studioのコードエディターのフォントとして設定する方法。

イベント情報(メディアスポンサーです)

Twitterでつぶやこう!


Build Insider賛同企業・団体

Build Insiderは、以下の企業・団体の支援を受けて活動しています(募集概要)。

ゴールドレベル

  • 日本マイクロソフト株式会社
  • グレープシティ株式会社