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


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

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

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

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

起動状態の保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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を表示し、動作を確認します。

1
Preference: InitState is [1 or 0]

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//ダイアログ表示
@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メニューを追加します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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)を追加する

3 Comments