2012/01/10

StrictMode:画面遷移の度に表示される赤枠を抑止する方法

GingerBreadから追加された機能StrictMode(厳格モード)について。

Android4.0(3.xから?)のエミュレータ等でStrictMode機能をONにしていなくても
StrictMode機能がONの状態となります。
この状態でUIスレッド上でDBにアクセスする等推奨ルールに違反すると画面
全体に赤枠が点滅表示されます。


設定アプリの[開発者向けオプション]→[厳格モードを有効にする]ON/OFFに
関わらず、engビルドされた環境では強制的にStrictModeがONになります。


userビルドの場合は、アプリが明示的にStrictModeをONに設定しない限り
StrictModeはOFFとなり赤枠点滅による通知は行われません。

しかし、engビルド環境と言えど赤枠が表示されるのは少々邪魔なものです。
赤枠表示をOFFにしたい場合は下記の方法が有効です。

【Dev toolsを使用した方法】
1.Dev Tool→StrictMode visual indicator:off に設定する
2.プロセスを再起動する

【システムプロパティを設定する方法】
1.adb shell setprop persist.sys.strictmode.visual 0
2.プロセスを再起動する

StrictModeの設定値を変更した後は、赤枠を表示したくないプロセスの再起動
が必要です。

ちなみに、StrictModeのログを抑止したい場合はadb logcatコマンドで
adb logcat StrictMode:S *:V
とします。

以上です。

2012/01/06

MENUキー押下でonPrepareOptionsMenuが呼ばれない問題


Honeycomb以降、ActivityのonCreate時にonCreateOptionsMenuとonPrepareOptionsMenu
が呼ばれるようになりました。
# アクションアイテム実装による変更かな?

注意するべきは、Activity起動後のMENUキー押下1回目にonPrepareOptionsMenuが
呼ばれなくなったということです。
# 2回目以降のMENUキー押下時はonPrepareOptionsMenuが呼ばれます。
もしonPrepareOptionsMenuでメニュー項目を動的に変更する、あるいは有効/無効を切
り変えるようなアプリは要注意です。

例えば、チェックボックスのON/OFFでメニュー項目の状態を変化させるために、
onPrepareOptionsMenuでチェックボックスの状態をチェックしてメニュー項目の状態を
動的に変更するような場合です。
1回目のMENUキー押下時はonPrepareOptionsMenuが実行されないため、正しくチェ
ックボックスの状態に合わせてメニュー項目を更新することができません。

解決方法の一つに、1回目のMENUキー押下時にも強制的にonPrepareOptionsMenu
を実行させて、従来通りのシーケンスを再現する方法があります。

1回目のMENUキー押下時にonPrepareOptionsMenuが実行されない原因は、Activity
のonCreate時にメニューが準備(onPrepareOptionsMenu)されることで、1回目のMENU
キー押下時の準備処理は不要と判断されるためです。

そこで、ActivityのonKeyDown処理で1回目のMENUキー押下時にオプションメニュー
を一度破棄します。
オプションメニューを破棄するにはinvalidateOptionsMenuを使用します。
オプションメニューを破棄することで、再度オプションメニューを表示しようとする時、
onCreateOptionsMenu⇒onPrepareOptionsMenuと呼ばれるようになります。

private boolean oneTimeFlag = true;
public boolean onKeyDown(int keyCode, KeyEvent event) {
  if (oneTimeFlag && keyCode == KeyEvent.KEYCODE_MENU) {
    invalidateOptionsMenu();
    oneTimeFlag = false;
  }
}

参考:Android Developer

以上です。