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のコードエディターのフォントとして設定する方法。