1page.title=アクティビティを再作成する 2page.tags=アクティビティのライフサイクル 3helpoutsWidget=true 4 5trainingnavtop=true 6 7@jd:body 8 9<div id="tb-wrapper"> 10 <div id="tb"> 11 12 <h2>このレッスンでの学習内容</h2> 13 <ol> 14 <li><a href="#SaveState">自分のアクティビティ状態を保存する</a></li> 15 <li><a href="#RestoreState">自分のアクティビティ状態をリストアする</a></li> 16 </ol> 17 18 <h2>関連ドキュメント</h2> 19 <ul> 20 <li><a href="{@docRoot}training/basics/supporting-devices/screens.html">異なる画面のサポート 21</a></li> 22 <li><a href="{@docRoot}guide/topics/resources/runtime-changes.html">実行時の変更を処理する</a></li> 23 <li><a href="{@docRoot}guide/components/activities.html">アクティビティ</a> 24 </li> 25 </ul> 26 27 </div> 28</div> 29 30<p>アクティビティには、通常のアプリの動作によって破棄されるいくつかのシナリオがあります。たとえば、ユーザーが <em>[戻る]</em> ボタンを押したり、アクティビティが {@link android.app.Activity#finish()} を呼び出すことによって自身の破棄を知らせる場合などです。 31 32システムはまた、現在停止していて長時間使用されていないアクティビティがある場合や、フォアグラウンドのアクティビティが多くのリソースを必要とするためにシステムがメモリを取り戻すためにバックグラウンド プロセスを停止する必要がある場合にも、アクティビティを破棄することがあります。 33 34</p> 35 36<p>ユーザーが <em>[戻る]</em> を押すか、アクティビティ自身が終了することでアクティビティが破棄されたとき、これらの動作はアクティビティの必要性がなくなったことを示すため、システムの方針として {@link android.app.Activity} インスタンスは永遠に失われます。 37 38システムの制約(通常のアプリの動作ではなく)が原因で 39アクティビティが破棄される場合、実際の 40{@link android.app.Activity} インスタンスは失われますが、アクティビティが存在していたことをシステムが記憶しているため、ユーザーがアクティビティに復帰した場合は、破棄されたときのアクティビティの状態を記述する一連の保存されたデータを使用して、アクティビティの新しいインスタンスが作成されます。 41 42システムが以前の状態を復元するために使用する保存されたデータは、「インスタンス状態」と呼ばれ、{@link android.os.Bundle} オブジェクトに格納されたキーと値のペアの集合です。 43 44</p> 45 46<p class="caution"><strong>警告: </strong>ユーザーが画面を回転させるたびに、アクティビティが破棄され、再作成されます。 47画面の向きが変更されると、画面構成が変更され、アクティビティで(レイアウトなどの)代替リソースをロードする必要が生じる場合があるため、システムはフォアグラウンドのアクティビティを破棄し、再作成します。 48 49</p> 50 51<p>デフォルトでは、システムは {@link android.os.Bundle} のインスタンス状態を使用して、アクティビティのレイアウトの各 {@link android.view.View} オブジェクトに関する情報を保存しています({@link android.widget.EditText} オブジェクトに入力されたテキスト値など)。 52 53アクティビティのインスタンスが破棄され、再作成される場合、レイアウトの状態はコードを必要とすることなく以前の状態に復元されます。 54 55しかし、アクティビティでは、アクティビティにおけるユーザーの作業状況を追跡しているメンバ変数などの、復元することが望ましいその他の情報が存在する可能性があります。 56 57</p> 58 59<p class="note"><strong>注:</strong> Android システムがアクティビティのビューの状態を復元できるようにするためには、<strong>各ビューは固有の ID を持っている必要があります</strong>。これは 60 <a href="{@docRoot}reference/android/view/View.html#attr_android:id">{@code 61android:id}</a> によって提供されます。 62</p> 63 64<p>アクティビティ状態についての追加データを保存するには、 65{@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} コールバック メソッドをオーバーライドする必要があります。システムは、ユーザーがアクティビティを離れようとするとこのメソッドを呼び出し、{@link android.os.Bundle} オブジェクトに渡してアクティビティが予期せずに破棄された場合に備えて保存します。 66 67 68システムが後でアクティビティのインスタンスを再作成する必要がある場合は、同じ {@link 69android.os.Bundle} オブジェクトを {@link android.app.Activity#onRestoreInstanceState 70onRestoreInstanceState()} と {@link android.app.Activity#onCreate onCreate()} 71 の両方のメソッドに渡します。 72</p> 73 74<img src="{@docRoot}images/training/basics/basic-lifecycle-savestate.png" /> 75<p class="img-caption"><strong>図 2.</strong> システムがアクティビティを停止し始めると、 76{@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}(1)が呼び出されるため、{@link android.app.Activity} インスタンスの再作成の必要がある場合に備えて、保存する追加の状態データを指定できます。アクティビティが破棄され、同じインスタンスを再作成する必要がある場合、システムは(1)で定義された状態データを {@link android.app.Activity#onCreate onCreate()} メソッド(2)と 77{@link android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} メソッド(3)の両方に渡します。 78 79 80 81 82</p> 83 84 85 86<h2 id="SaveState">自分のアクティビティ状態を保存する</h2> 87 88<p>アクティビティが停止し始めると、システムは {@link android.app.Activity#onSaveInstanceState 89onSaveInstanceState()} を呼び出すため、アクティビティではキー値のペアのコレクションを使用して、状態情報を保存することができます。 90このメソッドのデフォルトの実装では、{@link android.widget.EditText} ウィジェット内のテキストまたは {@link android.widget.ListView} のスクロール位置などのアクティビティのビュー階層の状態に関する情報が保存されます。 91 92</p> 93 94<p>アクティビティの追加の状態情報を保存するには、 95{@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} を実装し、{@link android.os.Bundle} オブジェクトにキー値のペアを追加する必要があります。 96次に例を示します。</p> 97 98<pre> 99static final String STATE_SCORE = "playerScore"; 100static final String STATE_LEVEL = "playerLevel"; 101... 102 103@Override 104public void onSaveInstanceState(Bundle savedInstanceState) { 105 // Save the user's current game state 106 savedInstanceState.putInt(STATE_SCORE, mCurrentScore); 107 savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); 108 109 // Always call the superclass so it can save the view hierarchy state 110 super.onSaveInstanceState(savedInstanceState); 111} 112</pre> 113 114<p class="caution"><strong>警告: </strong>デフォルトの実装でビュー階層の状態を保存できるよう、{@link 115android.app.Activity#onSaveInstanceState onSaveInstanceState()} のスーパークラスの実装を常に呼び出す必要があります。 116</p> 117 118 119 120<h2 id="RestoreState">自分のアクティビティ状態をリストアする</h2> 121 122<p>以前破棄された後にアクティビティが再作成される場合、システムがアクティビティを渡した先の {@link android.os.Bundle} から、保存済みの状態を回復することができます。 123 124{@link android.app.Activity#onCreate onCreate()} と {@link 125android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} の両方のコールバック メソッドが、インスタンスの状態情報を含む同じ {@link android.os.Bundle} を受け取ります。 126</p> 127 128<p>{@link android.app.Activity#onCreate onCreate()} メソッドは、システムがアクティビティの新しいインスタンスを作成しているか、以前のものを復元しているかどうかに関係なく呼び出されるため、状態の {@link android.os.Bundle} を読み取る前にこれが null かどうかを確認する必要があります。 129 130null の場合は、破棄された以前のアクティビティを復元する代わりにアクティビティの新しいインスタンスが作成されます。 131 132</p> 133 134<p>{@link android.app.Activity#onCreate 135onCreate()} で、いくつかの状態データを復元する方法について、次に例を示します。</p> 136 137<pre> 138@Override 139protected void onCreate(Bundle savedInstanceState) { 140 super.onCreate(savedInstanceState); // Always call the superclass first 141 142 // Check whether we're recreating a previously destroyed instance 143 if (savedInstanceState != null) { 144 // Restore value of members from saved state 145 mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 146 mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 147 } else { 148 // Probably initialize members with default values for a new instance 149 } 150 ... 151} 152</pre> 153 154<p>{@link android.app.Activity#onCreate onCreate()} 中に状態を復元する代わりに、 155{@link android.app.Activity#onStart()} メソッドの後に呼び出される {@link 156android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} の実装を選択できます。 157復元対象の保存済みの状態がある場合のみ {@link 158android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} が呼び出されるため、 159{@link android.os.Bundle} が null であるかどうかをチェックする必要はありません。</p> 160 161<pre> 162public void onRestoreInstanceState(Bundle savedInstanceState) { 163 // Always call the superclass so it can restore the view hierarchy 164 super.onRestoreInstanceState(savedInstanceState); 165 166 // Restore state members from saved instance 167 mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 168 mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 169} 170</pre> 171 172<p class="caution"><strong>警告: </strong>デフォルトの実装でビュー階層の状態を復元できるよう、{@link 173android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} のスーパークラスの実装を常に呼び出す必要があります。 174</p> 175 176<p>実行時の再起動イベント(画面が回転したときなど)によるアクティビティの再作成の詳細については、<a href="{@docRoot}guide/topics/resources/runtime-changes.html">実行時の変更を処理する</a>をお読みください。 177</p> 178 179