妄想プログラマのらくがき帳 : 12月 2012

2012年12月18日火曜日

[Android]Windowsでいうところのiniファイル

アプリの設定や前回終了時の状態などを保存する手軽な方法として、
AndroidにはSharedPreferencesがあります(Windowsでいうところのiniファイルのようなものです)。

  • データを保存する

データを保存するには、SharedPreferences.Editorを使います。
//Activity.getPreferences()でSharedPreferencesを取得
SharedPreferences preferences = getPreferences(MODE_PRIVATE);
//SharedPreferences.Editorを取得
Editor editor = preferences.edit();

//Editorを用いてデータを編集
//Key=MyKey,Value=Helloを保存
editor.putString("MyKey", "Hello");

//削除するときは、remove()に削除するデータのkeyを指定
//editor.remove("MyKey");

//最後にcommit()しないと編集が確定されず、保存されないので注意
editor.commit();

  • データを読み込む

データを読み込むには、SharedPreferencesを使います。
//Activity.getPreferences()でSharedPreferencesを取得
SharedPreferences preferences = getPreferences(MODE_PRIVATE);

//Keyを指定して値を取得
//第2引数には、指定したKeyが見つからなかった場合に返されるデフォルト値を指定
String myKeyValue = preferences.getString("MyKey", "");

2012年12月13日木曜日

[Android]マニフェストファイルのapplicationの子要素に<meta-data>を含める。

公式のドキュメントには載っていませんが、
マニフェストファイルのapplicationの子要素に<meta-data>を含めることが出来ます。

例えば、applicationの子要素に、ログレベルを指定する<meta-data>を追加するとします。
<meta-data
    android:name="com.example.androidsample.log_level"
    android:value="4" />

設定したデータは以下のように実行時に参照できます。
ApplicationInfo appInfo = getPackageManager().getApplicationInfo(
       this.getPackageName(), PackageManager.GET_META_DATA);

int logLevel = appInfo.metaData.getInt("com.example.androidsample.log_level");
logLevelには4が入ります。

結構いろいろな使い道がありそうですが、公式のドキュメントに載っていないというのが最大のネックですね。
ドキュメントに載っていない=サポート外と考えられるので、APIのバージョンが変わったら
急に使えなくなるとかありそうですし。。。

2012年12月9日日曜日

[Android]Logレベルの設定

Androidでは、LogレベルをTAGごとに設定できます。
特定のTAGに設定されているLogレベルは、Log.isLoggable(String tag, int level)で確認できます。
例えばTAGが"MyActivity"の場合、

Log.isLoggable("MyActivity",  Log.VERBOSE)  ⇒  False
Log.isLoggable("MyActivity",  Log.DEBUG)  ⇒  False
Log.isLoggable("MyActivity",  Log.INFO)  ⇒  True
Log.isLoggable("MyActivity",  Log.WARN)  ⇒  True
Log.isLoggable("MyActivity",  Log.ERROR)  ⇒  True

となれば、TAG"MyActiviti"のLogレベルはINFOです。

AndroidのデフォルトLogレベルはINFOなので、
特に何も設定しない場合、isLoggable()は上記のような結果になります。
このLogレベルですが、変更する方法として次の2つの方法があります。

1.adbで変更する

adbで以下のコマンドを実行することで、Logレベルを変更できます。
adb shell setprop log.tag.MyActivity DEBUG
この場合、TAG"MyActivity"のLogレベルがDEBUGに設定されます。

2.local.propで変更する

/data/local.propに次の1行を追加します。(local.propが無ければ作成する)

log.tag.MyActivity=VERBOSE

この場合、TAG"MyActivity"のLogレベルがVERBOSEに設定されます。

以上の2つの方法でLogレベルを変更できるのですが、
設定できるLogレベルは、VERBOSE、DEBUG、INFOのいずれかのようです。
WARNやERRORに設定しようとしてもINFOに設定されてしまいます。

Logレベルの設定方法がわかり、これでLogの出力制御ができる!
っと思いきや、実はこれだけでは出力制御はできません。
なぜならば、Log.v()やLog.d()などのメソッドはレベルに関係なくログを出力してしまうからです。
何のためのLogレベルだよ!って感じですが、そういう仕様みたいです。
なので、出力制御するには以下のような処理をかます必要があります。
if (Log.isLoggable("MyActivity", Log.DEBUG)) {
 Log.d("MyActivity", "ログ・メッセージ");
}
実際に使う場合は、上記のような処理をまとめたLogクラスを作成して使うことになると思います。

しかし、何故こんな仕様なんだろう。。。