読者です 読者をやめる 読者になる 読者になる

SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

Xamarin.Android プリファレンス

【 Xamarin 記事一覧 】

1 プリファレンス

Androidアプリでは、いくつかのデータ保存方法が用意されていますが、最も簡単に扱えるのが、この「プリファレンス(Preference)」だと思います。プリファレンスは、キー名と値のセットで保存されます。

(1) GetPreferences

GetPreferences()を使用してデータを保存することができます。
このメソッドは、アクティビティのクラス名をプリファレンス名として動作するので、引数にはファイル作成モードだけが指定されます。
アクティビティごとのデータを保存するには丁度いいようです。


//保存
var sp = GetPreferences(FileCreationMode.Private);
var edit = sp.Edit();
edit.PutString("Key1", "Value1");
edit.Commit();



//読込み
var sp = GetPreferences(FileCreationMode.Private);
var str = sp.GetString("key1",null);


保存されたデータは、アプリケーションのデータ領域でshared_prefsの下にxml形式で格納されます。
001

保存されたファイルの内容は、下記のようになっていました。

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="Key1">Value1</string>
</map>

データを確認するためにDDMSの「File Explorer」を使用しました。
DDMSは、Eclipseからだと「DDMSパースペクティブ」のメニューがあるようですが、VisualStuidからはメニューが見当たらないので、ちょっと戸惑いました。起動はコマンドラインからしかできないようです。


c\Users\xxxxx\ユーザ\AppData\Local\Android\android-sdk\tools\ddms.bat

(2) GetSharedPreferences

002

GetSharedPreferences()を使用すると、ファイル名を指定する事ができます。
アクティビティをまたいでデータの読み込みが可能なので、アプリケーションで共通のデータを保存するには丁度いいと思います。


var sp = GetSharedPreferences("TEST", FileCreationMode.Private);


(3) GetDefaultSharedPreferences

003

GetDefaultSharedPreferences()では、「アプリケーション名_preference.xml」でファイルが生成されます。

先のGetPreferences及びGetSharedPreferencesは、Activityのメソッドなので、そのまま使用できますが、こちらは、Android.Preferences.PreferenceManagerのstaticメソッドです。


var dsp = PreferenceManager.GetDefaultSharedPreferences(this); 

2 アプリ間の共有

(1) パーミッション

004

GetPreferencesとGetSharedPreferencesでは、パラメータでファイル作成モード(Append,Private,WorldReadable,WorldWriteable)を指定できます。

4種類のアクセス権でファイルを作成した様子が下記のとおりです。

var e1 = GetSharedPreferences("TEST", FileCreationMode.Private).Edit();
e1.PutString("key", "TEST");
e1.Commit();

var e2 = GetSharedPreferences("TEST_R", FileCreationMode.WorldReadable).Edit();
e2.PutString("key", "TEST_R");
e2.Commit();

var e3 = GetSharedPreferences("TEST_W", FileCreationMode.WorldWriteable).Edit();
e3.PutString("key", "TEST_W");
e3.Commit();

var e4 = GetSharedPreferences("TEST_RW", FileCreationMode.WorldReadable|FileCreationMode.WorldWriteable).Edit();
e4.PutString("key", "TEST_RW");
e4.Commit();

005

OTHERのパーミッションに違いが見て取れます。

(2) 他のアプリからの読み込み

他のアプリからプリファレンスを読込むには、CreatePackageContextを使用して対象アプリのコンテキストを取得する必要があります。


//他のアプリのコンテキストを取得
var context = CreatePackageContext("AndroidApplication1.AndroidApplication1", PackageContextFlags.Restricted);
//取得したコンテキストを利用してプリファレンスを取得する
var test = context.GetSharedPreferences("TEST", FileCreationMode.Private);
var testR = context.GetSharedPreferences("TEST_R", FileCreationMode.Private);
var testW = context.GetSharedPreferences("TEST_W", FileCreationMode.Private);
var testRw = context.GetSharedPreferences("TEST_RW", FileCreationMode.Private);
           
//データ取得
var s1 = test.GetString("key", "");
var s2 = testR.GetString("key", "");
var s3 = testW.GetString("key", "");
var s4 = testRw.GetString("key", "");

//Toastで表示
var str = string.Format("TEST={0}\nTEST_R={1}\nTEST_W={2}\nTEST_RW={3}\n", s1, s2, s3, s4);
Toast.MakeText(this, str, ToastLength.Short).Show();

006
取得した結果から、保存側でFileCreationMode.WorldReadable(読み込み可能)が指定されたデータしか読みだせないことが分かります。

なお、同一のアプリケーション内では、Linuxのユーザが同一のため、アクティビティが違っても、Privateで読み書き可能です。

【 Xamarin 記事一覧 】