Hatena::Groupandroid

lnzntの Android 日記 このページをアンテナに追加 RSSフィード

2012年04月12日(木)

アクティビティ状態の保存/復元

22:57 | アクティビティ状態の保存/復元 - lnzntの Android 日記 を含むブックマーク はてなブックマーク - アクティビティ状態の保存/復元 - lnzntの Android 日記 アクティビティ状態の保存/復元 - lnzntの Android 日記 のブックマークコメント

アクティビティは onSaveInstanceState() と onRestoreInstanceState() で状態の保存/復元をできるようです。

onSaveInstanceState()

onSaveInstanceState() は onStop() の前に呼ばれます。

  • onPause() -> onSaveInstanceState() -> onStop()

ただし必ず呼ばれる訳ではなく、明確にアクティビティが破棄されるなど保存の必要がない場合は呼び出されません。

onRestoreInstanceState()

onRestoreInstanceState() は onResume() の前に呼ばれます。

  • onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()

こちらも必ず呼ばれる訳でなく、以下などのように復元の必要がない場合は呼び出されません。

  • 最初の onCreate() -> onStart() -> onResume() の場合は呼ばれない
  • onRestart() -> onStart() -> onResume() の場合は呼ばれない

----

前回作った AlertDialog を状態の保存/復元するように変更してみました。

そして、もしダイアログが表示したまま画面回転した場合やホームに戻った場合などは、再起動した時にダイアログを再表示させるようにしてみました。

f:id:lnznt:20120412224414j:image

以下、コードです。

package com.example.alertdialogsample;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.util.Log;

public class AlertDialogSampleActivity extends Activity {
    private static final String logTag = "AlertDialogSample";
    private Activity activity = AlertDialogSampleActivity.this;
    
    private DialogInterface.OnClickListener clickListener;

    private AlertDialog alertDialog;
    
    private final static String shownKey   = ":shown";
    private final static String clickedKey = ":clicked";
    private final static String statusKey  = ":status";
    
    private boolean shown;
    private boolean clicked;
    private String status;
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Log.d(logTag, "**** onCreate() ****");
        
        //
        // リスナの生成
        //
        clickListener = new DialogInterface.OnClickListener() {         
            @Override
            public void onClick(DialogInterface dialog, int which) {
                int labelId;
                
                switch (which) {
                case AlertDialog.BUTTON_POSITIVE:
                    labelId = R.string.label_positive;
                    break;
                case AlertDialog.BUTTON_NEGATIVE:
                    labelId = R.string.label_negative;
                    break;
                default:
                    labelId = R.string.label_neutral;
                    break;
                }
                        
                String label = activity.getString(labelId);
                Log.d(logTag, "[" + label + "] clicked.");
        
                shown   = false;
                clicked = true; 
                status  = new String(label);
            }
        };
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    
        Log.d(logTag, "**** onDestroy() ****");
    }
    
    @Override
    public void onRestart() {
        super.onRestart();
        
        Log.d(logTag, "**** onRestart() ****");
    }
    
    @Override
    public void onStart() {
        super.onStart();
        
        Log.d(logTag, "**** onStart() ****");
    }
    
    @Override
    public void onStop() {
        super.onStop();
        
        Log.d(logTag, "**** onStop() ****");
    } 
     
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        
        Log.d(logTag, "**** onSaveInstanceState() ****");
  
        outState.putBoolean(shownKey, shown);
        outState.putBoolean(clickedKey, clicked);       
        outState.putString(statusKey, status);
        
        Log.d(logTag, "saved: " + shownKey   + " <= " + shown); 
        Log.d(logTag, "saved: " + clickedKey + " <= " + clicked);       
        Log.d(logTag, "saved: " + statusKey  + " <= " + status);
    }
    
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        
        Log.d(logTag, "**** onRestoreInstanceState() ****");
  
        shown   = savedInstanceState.getBoolean(shownKey);
        clicked = savedInstanceState.getBoolean(clickedKey);
        status  = savedInstanceState.getString(statusKey);
 
        Log.d(logTag, "restore: " + shownKey   + " => " + shown);
        Log.d(logTag, "restore: " + clickedKey + " => " + clicked);     
        Log.d(logTag, "restore: " + statusKey  + " => " + status);
    }
    
    @Override
    public void onResume() {
        super.onResume();
        
        Log.d(logTag, "**** onResume() ****");
        
        Log.d(logTag, "shown:"   + shown);
        Log.d(logTag, "clicked:" + clicked);
        Log.d(logTag, "status:"  + status);
        
        //
        // ダイアログの生成
        //
        alertDialog = new AlertDialog.Builder(activity)
            .setTitle(R.string.dialog_title)
            .setMessage(R.string.dialog_message)
            .setPositiveButton(R.string.label_positive, clickListener)
            .setNegativeButton(R.string.label_negative, clickListener)
            .setNeutralButton(R.string.label_neutral, clickListener)
            .create();
        
        Log.d(logTag, "alert dialog created.");
        
        //
        // shown が TRUE だったらダイアログ表示
        //
        if (shown == true) {
            clicked = false;
            status  = "(none)";     
            
            alertDialog.show();
            
            Log.d(logTag, "alert dialog resumed.");
        }
    }
    
    @Override
    public void onPause() {
        super.onPause();
        
        Log.d(logTag, "**** onPause() ****");
        
        //
        // ダイアログの終了処理
        //
        alertDialog.dismiss();
        
        Log.d(logTag, "alert dialog dismissed.");
    }
     
    public void onClick(View v) {
        Log.d(logTag, "**** onClick() ****");
        
        //
        // ダイアログの表示
        //
        shown   = true;
        clicked = false;
        status  = "(none)";     
        
        alertDialog.show();
        
        Log.d(logTag, "alert dialog shown.");
    }
}