• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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&#64;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&#64;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