Android, 時々Web

Androidアプリを作ったり、Webサービスを作ったりする中で困ったことや詰まったことを解決したときの備忘録です。備忘録なので、正しい答えが書いてあるとは限りません。

画面回転によるActivityの再起動に対応する

※この記事はあまりよく理解していない人が書いているので、あまり参考にしないでください。

 

さて前置きしたところで、

今までActivityの再起動、再作成が面倒だったので、画面を回転できないように固定するという解決策を取っていたが、そうは言ってられなくなったので対応したのでメモ。

Activityが再作成されて何が問題かというと、自分が分かる範囲では、

1.インスタンス変数などが初期化される。

2.onCreateが再び呼ばれる。

ということです。つまり、もう一度最初から処理が走ってしまうし、その時の変数は完全に失われているということ。

これに対応するために、onSaveInstanceStateとかonRestoreInstanceStateなどを使うらしい。

(ところでonCreate時に渡される引数、savedInstanceStateとはいつ使うのだろうか?)

 

簡単に例を挙げると、こんな感じ。

@Override
public void onSaveInstanceState(Bundle state){
super.onSaveInstanceState(state);
state.putString("FILE_PATH", mSavedImageFilePath);
}

@Override
public void onRestoreInstanceState(Bundle state){
super.onRestoreInstanceState(state);
mSavedImageFilePath = state.getString("FILE_PATH");
}

こうやってインスタンス変数をBundleにputして、そしてリストアされるときにインスタンス変数にBundleからgetしたものを代入する。

そうすることで画面回転前と後でインスタンス変数が共有される。

 

あと、onCreateにもう一度走ってしまうと不都合があるコードが含まれているのなら、

if( savedInstanceState == null){
// ここに再作成時には実行したくない処理
}

という風にしておくと2回目以降の再作成では実行されない。