2012-03-01

Androidにデバッグ設定用の隠しActivityをつくると便利

Andridアプリをリリースする前に、テスト用サーバーに接続したり、内部処理で使うパラメータを一時的に変更して動作確認をすることはよくあることだと思います。
このとき、一時的にせよ直接コードを変更して動作確認を行うのは嫌なものです。ビリドをやり直すのが面倒くさいですし、間違えてデバッグ用の設定のままアプリをリリースしてしまうリスクがあります。
そこで、デバッグ用の設定を行う隠しアクティビティを用意しておくといいと思います。特別なIntentを投げない限り表示されないActivityを定義しておいて、そこで接続するサーバーのURLや各種のパラメータを設定できるようにしておきます。この設定画面は、ユーザーが通常の使い方をしている限りは表示されない画面なので、呼出し用アプリを専用につくっておくことになります。(ユーザーが絶対に表示できないというわけではないので、本当に大事なデータは編集できないようにしておいた方がいいです。)



デバッグ設定画面の呼出しアプリは、メインのActivityはおおよそ次にようになります。button1が押されたときに、暗黙的Intentを使ってデバッグ画面を起動できるようにしています。
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button btn = (Button) findViewById(R.id.button1);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                Intent intent = new Intent("custom.intent.action.DEBUG_SETTING");
                startActivity(intent);
            }
            catch (ActivityNotFoundException ex) {
                Toast.makeText(MainActivity.this, ex.toString(), Toast.LENGTH_LONG).show();
            }
        }
    });
}
"custom.intent.action.DEBUG_SETTING" の部分は自分で勝手に定義したActionです。勝手に定義したActionなので、他のアプリから意図せずに呼び出されることは通常はないはずです。
デバッグ対象のアプリ側で、このActionに対応できるようにします。このActionに対応できるアプリ(正確にはActivity)が複数ある場合は、アプリを選択するダイアログが表示されるので、新しくアプリを開発することになった場合も、新アプリでこのActionを受け取れるようにすれば、呼出しアプリを修正したりリビルドしたりする必要はありません。

デバッグ対象のアプリについては、manifexst.xmlに次のようなIntent Filterを持つActivityを追加します。
<activity
    android:name=".DebugSettingActivity"
    <intent-filter>
        <action android:name="custom.intent.action.DEBUG_SETTING" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="custom.intent.category.THIS_APP_ID" />
    </intent-filter>
</activity>
"custom.intent.action.DEBUG_SETTING" の部分は、呼出しアプリ側と同じActionにします。
"android.intent.category.DEFAULT"は、Androidシステムに定義されているカテゴリで、これを定義しておかないと他のアプリからデバッグ設定アクティビティを起動できません。
"custom.intent.category.THIS_APP_ID"には、アプリに固有のカテゴリ名を勝手につくって定義しておきます。定義しておけば、なんらかの事情で起動するアプリを一つに絞り込みたいときに、このカテゴリをIntentに指定すれば良いようになります。別にこれは無くてもいいんですが、あっても困りません。

設定データの保存には、SharedPreferencesを使うのがいいかと思います。データを保存するためには、先ほどmanifest.xmlに定義したDebugSettingActivityの適切な場所に、次のようにしてな処理を書くことになります。。
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
Editor editor = prefs.edit();
editor.putString("SomeSettingKey", "SomeSettingValue");
editor.commit();

0 件のコメント: