変数等の値の保持 onSaveInstanceState と onRestoreInstanceState

2,983 views
Skip to first unread message

村中郷志

unread,
Oct 7, 2014, 10:14:41 AM10/7/14
to android-g...@googlegroups.com
村中と申します。

他のアプリケーションを起動してて現在の Activity が隠れる、省電力モードになって画面が消える、
ホームボタンで Activity が消える、などとした場合でも変数等の値を保持したい時、どのように
するのが理想的な方法でしょうか?

onSaveInstanceState と onRestoreInstanceState を使ってみましたが、呼ばれないことが
あります。

どなたか、詳しい方がいらっしゃいましたら、ご教授願います。

@Override
protected void onSaveInstanceState(Bundle outState) {
   super.onSaveInstanceState(outState);
   
   Log.d("Lifecycle","onSaveInstanceState()");
 
   outState.putInt("PAGE_NO", currentIndex);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
   super.onRestoreInstanceState(savedInstanceState);
   
   Log.d("Lifecycle","onRestoreInstanceState()");
 
   //インスタンスの復帰
   currentIndex = savedInstanceState.getInt("PAGE_NO");
   
}

Hirokazu Fukami

unread,
Oct 7, 2014, 10:19:18 AM10/7/14
to android-g...@googlegroups.com
こんばんはfkmです。

onSaveInstanceState()とonRestoreInstanceState()でやるのが鉄則です。

ですが、通常の状態だとActivityが破棄されるタイミングはまちまちなので、
開発時は「設定」→「開発者オプション」→「Activityを保持しない」
にチェックをつけて、ホームボタンを押したりして動作確認してみてください。
> --
> このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> android-group-j...@googlegroups.com にメールを送信してください。
> このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
-------------------------------------------------------------
深見 浩和(Hirokazu Fukami)

URI:http://www.fkmsoft.jp
email: f...@fkmsoft.jp

M.M. MSL

unread,
Oct 9, 2014, 1:35:56 AM10/9/14
to android-g...@googlegroups.com
こんにちは、M.M. MSLです。

ぱっと見た限りだと、onPauseとonResumeでやったほうが良いと思います。
onSaveInstanceStateとonRestoreInstanceStateは必ず呼ばれるわけではありません。
この二つは、アクティビティの基本的なライフサイクルでは無く、補助的に使うものだと認識しています。
ご質問の内容ですと、基本的なライフサイクルを経由していると思われますのでonPauseとonResumeで処理し、
プリファレンス等を用いて値を保持、復元するのが良いのではないでしょうか。

// アクティビティのポーズ時
@Override
public void onPause() {
//処理内容

//ここまで
super.onPause();
}

// アクティビティの再表示時
@Override
public void onResume() {
super.onResume();
//処理内容

//ここまで
}



2014年10月7日火曜日 23時14分41秒 UTC+9 村中郷志:

Makoto Yamazaki

unread,
Oct 9, 2014, 1:53:32 AM10/9/14
to android-g...@googlegroups.com
zaki です。

onSaveInstanceState で問題ないように思いますが、どのような時に呼ばれないでしょうか。

復元については、onRestoreInstanceState で実装するのではなく、onCreate の中で
引き数の savedInstanceState が null でないときに処理を行うように書くことが
多いです。

--
このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。
このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
YAMAZAKI Makoto

M.M. MSL

unread,
Oct 9, 2014, 8:38:45 AM10/9/14
to android-g...@googlegroups.com
こんばんわ、M.M. MSLです。

zakiさん、

恐らくこれは僕宛かと推測してお答えします。
>>>onSaveInstanceState で問題ないように思いますが、どのような時に呼ばれないでしょうか。

恐らくzakiさんのやり方でも問題ないと思います。
onSaveInstanceState が呼ばれない可能性があるのは、主にバックキーが押された時や finish()
呼び出しの時など、システムが勝手に切った場合では無い時だと認識しています。
ただ、下記デヴェロッパー公式に呼ばれない条件がいまいちはっきり書かれていない
(呼ばれない場合があるので、永続化したいデータはonPauseで保存しろと書いてある)
ので、僕の場合は画面回転のような瞬間的なものでしか使っていません。

ちょっと書き方がまずかったかなと思いますので補足しますと、僕の文中での「基本的なライフサイクル」うんぬんというのは
画面回転が入っていない場合を指しています。

皆さんonSaveInstanceStateで処理されているようですね。
onPauseで処理している僕のようなパターンというのは珍しいのでしょうか。。

2014年10月9日木曜日 14時53分32秒 UTC+9 zaki:
このグループから退会し、グループからのメールの配信を停止するには android-group-japan+unsub...@googlegroups.com にメールを送信してください。

このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
YAMAZAKI Makoto

村中郷志

unread,
Oct 9, 2014, 9:20:20 AM10/9/14
to android-g...@googlegroups.com
ご返答頂いた方々へ

初学者の私に、いろいろと教えて頂きまして、本当に有難うございます。

この投稿をしたきっかけは、Logでテストした結果、onSaveInstanceState が呼ばれていない
ことがあり、なぜだろう?と悩んだでいたのです。

具体的にやりたいことは、ViewPagerで現在のページ位置を保持しておきたいのです。

しかし、他のアプリを起動してみたり、省エネモードから再度立ち上げてしてみたりすると、
onSaveInstanceState ではうまくいかないことがありました・・・

onPauseにてSharedPreferencesでプリファレンスファイルに保持、onResumeで保持した
値を取得する、というのが、確実な方法ですかね?





2014年10月9日木曜日 21時38分45秒 UTC+9 M.M. MSL:

M.M. MSL

unread,
Oct 10, 2014, 2:52:52 AM10/10/14
to android-g...@googlegroups.com
こんにちは。M.M. MSLです。

村中さん、
現在のページ位置を長期間保持しておきたいということであれば、そうなるかと思います。
データ量も少ないと思われますので、プリファレンスで十分いけるのではないでしょうか。


2014年10月9日木曜日 22時20分20秒 UTC+9 村中郷志:

Makoto Yamazaki

unread,
Oct 10, 2014, 3:02:47 AM10/10/14
to android-g...@googlegroups.com
zaki です。

shared preferences に記憶するのと、 instance state に記憶するのは目的が異なります。
shared preferences は、アプリが存続する間は残る情報なのに対し、 instance state は
Activity が開始されてから finish() するまでの間、各 Activity 毎に個別に保持される情報です。

要するにスコープが違うので目的にあったものをつかうべきだと思います。



このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。

このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
YAMAZAKI Makoto
Reply all
Reply to author
Forward
0 new messages