 
Xamarin逆引きTips
Xamarin.AndroidでApplicationクラスを拡張するには?
Applicationクラスを拡張すると、アプリケーションイベントの発生時に独自の処理を実行したり、アプリケーションオブジェクトに機能を追加したりできる。その基本的な実装方法を解説する。
 ネイティブのAndroid開発では、アプリケーションが起動する時に生成されるApplicationクラスがあり、これを開発者が拡張して、独自の処理を行うことができる。
 今回は、Xamarin.Androidで、Applicationを拡張して使用する方法を解説する。
1. Applicationクラスを拡張したクラスの作成
 Applicationクラスを拡張したクラスを、以下のコードのように用意する。
| 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     }   } } | 
 ここで作成するMyApplicationクラスは、Applicationクラス(Android.App名前空間)から派生させ(1)、さらに[Application]属性を付与する(2)。
次に、これはJavaのオブジェクトであるので、3のようなコンストラクターを用意する。
4は、アプリケーションが生成された時に、ログを出力する処理だ。
1は、ネイティブのAndroid開発と同じであるが、2、3はXamarin.Android独自の手法だ。これらを忘れると、Applicationクラスとして認識されないので注意が必要だ。
 Xamarin.AndroidでApplicationクラスを拡張する手順はこれだけだ。ネイティブのAndroid開発では、AndroidManifest.xmlファイルへの記述が必要だが、Xamarin.Androidでは2で付与した属性がその代わりとなる。
この状態で、アプリケーションを実行すると、図1のように、Xamarin Studioのアプリケーション出力に、ログが出力されるのが確認できる。
2. 拡張したアプリケーションクラスを参照する
アプリケーションオブジェクト(=Applicationクラスのオブジェクト)の生存期間は、アプリケーション自体の生成から破棄までなので、画面に依存しないデータなどの保存に使用されることが多い。
 先ほどのMyApplicationクラスに少し書き足して、データを保存するGlobalDataプロパティを追加したのが、下のコードだ。
| ……省略…… namespace ApplicationClassSample {   [Application]   public class MyApplication : Application   {     // 追記ここから     public string GlobalData     {       get;       set;     }     // 追記ここまで     public MyApplication (IntPtr javaReference, JniHandleOwnership transfer)     : base(javaReference, transfer)     {     }     ……省略……   } } | 
 Activity内で、MyApplicationオブジェクトを取得するには、以下のように記述する。
| ……省略…… 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         }       };     }   } } | 
 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のコードエディターのフォントとして設定する方法。





 
 
