X

初回起動時に1度だけダイアログを出す方法

今回はアプリケーションの初回起動を判定して、ダイアログを出す方法を紹介します。

サンプルコードでは、SharedPreferencesを使い、初回起動を判定します。初回であればダイアログを表示、2度目以降であれば非表示にする等、表示処理を切り替えています。「はじめに」や「利用規約」、「簡単な使い方の説明」など頻繁に見せる必要は無いが、必ず目を通してほしい項目の表示に有効でしょう。
ダイアログ表示以外にも特定のActivityを表示するなどUIを変更したり、データ保存方法をアプリケーションの実装にあわせてSharedPreferences以外を選択したり、応用を考えてみてください。

本記事を読む前に以下内容について確認しておくとスムーズです。

ソースコードは続きから。
起動時の状態保存、初回ダイアログ、起動状態のクリアの3つのステップにわけて解説します。

起動状態の保存

    public static final int PREFERENCE_INIT = 0;
    public static final int PREFERENCE_BOOTED = 1;

    //データ保存
    private void setState(int state) {
        // SharedPreferences設定を保存
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
        sp.edit().putInt("InitState", state).commit();

        //ログ表示
        output( String.valueOf(state) );
    }

    //データ読み出し
    private int getState() {
        // 読み込み
    	int state;
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
        state = sp.getInt("InitState", PREFERENCE_INIT);

        //ログ表示
        output( String.valueOf(state) );
        return state;
    }

    //データ表示
    private void output(String string){
    	TextView tv = (TextView) findViewById(R.id.TextView);
    	tv.setText("Preference: InitState is " + string);
    }

setState関数でSharedPreferencesに状態(InitState)を保存します。設定値はPREFERENCE_INIT or PREFERENCE_BOOTEDです。
getState関数ではSharedPreferences#getIntメソッドを利用してInitStateを取得します。第2引数は未保存状態など、取得できなかった場合の初期値です。
デバッグ用にoutput関数を用意しました。TextViewに現在のInitStateを表示し、動作を確認します。

Preference: InitState is [1 or 0]

上記のように、Activity上に現在の状態を表示します。
関連:データを簡単に保存する方法(Preference編)

初回のみダイアログを表示する

    //ダイアログ表示
    @Override
    public void onResume(){
        super.onResume();

        AlertDialog.Builder alertDialog=new AlertDialog.Builder(this);

        // ダイアログの設定
        alertDialog.setTitle("FirstBoot");          //タイトル
        alertDialog.setMessage("初回メッセージ");      //内容
        alertDialog.setIcon(R.drawable.icon);   //アイコン設定

        alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
            	//初回表示完了
            	setState(PREFERENCE_BOOTED);
            }
        });

        // ダイアログの作成と表示
        if(PREFERENCE_INIT == getState() ){
        	//初回起動時のみ表示する
        	alertDialog.create();
        	alertDialog.show();
        }
    }

17行目:ダイアログのOKボタンを押下した場合のみ、SharedPreferencesのInitStateに初回起動完了(PREFERENCE_BOOTED)を設定します。
22行目:現在の状態に応じて(初回起動のPREFERENCE_INIT時のみ)ダイアログを生成/表示します。

関連:AlertDialogで警告画面を表示する(1)

ワンポイント:ライフサイクルに注意
Activity#onResumeでダイアログ表示を実装するのはAndroidアプリケーションのライフサイクルに関係するんだ。アプリの切り替え時など、onCreateメソッドを経由しないケースをフォローしているよ。
ライフサイクルは図解Androidのライフサイクルとプラットフォームで確認してね。

起動状態をクリアする


「初回起動時にしか表示されない」という実装はデバッグが難しくなるため、デバッグ用に起動状態(InitState)をクリアするためのOptionメニューを追加します。

    public static final int MENU_SELECT_CLEAR = 0;

    //メニュー作成
    public boolean onCreateOptionsMenu(Menu menu){
    	//Clearボタンの追加
        menu.add(0, MENU_SELECT_CLEAR, 0, "Clear")
        	.setIcon(android.R.drawable.ic_menu_close_clear_cancel);

        return true;
    }

    //メニュー実行時の処理
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case MENU_SELECT_CLEAR:
        	//状態を忘れる
        	setState(PREFERENCE_INIT);
            return true;
        }
        return false;
    }

onCreateOptionsMenuメソッドでオプションメニューのクリアボタン(状態を初期化する)を追加します
17行目:onOptionsItemSelectedメソッドはメニューが選択された場合の処理です。起動状態を初期化します

関連:オプションメニュー(OptionsMenu)を追加する

mhidaka: Software Engineerだよ。DroidKaigi Organizer / Androidと組込とRe:VIEW。techbooster主宰。mhidaka's writings http://booklog.jp/users/mhidaka 技術書典! http://techbookfest.org