1page.title=アクティビティ 2page.tags=activity,intent 3@jd:body 4 5<div id="qv-wrapper"> 6<div id="qv"> 7<h2>本書の内容</h2> 8<ol> 9 <li><a href="#Creating">アクティビティを作成する</a> 10 <ol> 11 <li><a href="#UI">ユーザー インターフェースを実装する</a></li> 12 <li><a href="#Declaring">マニフェストでアクティビティを宣言する</a></li> 13 </ol> 14 </li> 15 <li><a href="#StartingAnActivity">アクティビティを開始する</a> 16 <ol> 17 <li><a href="#StartingAnActivityForResult">結果待ちのアクティビティを開始する</a></li> 18 </ol> 19 </li> 20 <li><a href="#ShuttingDown">アクティビティをシャットダウンする</a></li> 21 <li><a href="#Lifecycle">アクティビティのライフサイクルを管理する</a> 22 <ol> 23 <li><a href="#ImplementingLifecycleCallbacks">ライフサイクル コールバックを実装する</a></li> 24 <li><a href="#SavingActivityState">アクティビティの状態を保存する</a></li> 25 <li><a href="#ConfigurationChanges">構成の変更を処理する</a></li> 26 <li><a href="#CoordinatingActivities">アクティビティを連携する</a></li> 27 </ol> 28 </li> 29</ol> 30 31<h2>キークラス</h2> 32<ol> 33 <li>{@link android.app.Activity}</li> 34</ol> 35 36<h2>関連ドキュメント</h2> 37<ol> 38 <li><a href="{@docRoot}guide/components/tasks-and-back-stack.html">タスクとバックスタック 39</a></li> 40</ol> 41 42</div> 43</div> 44 45 46 47<p>{@link android.app.Activity} は、電話をかける、写真を撮影する、メールを送る、マップを閲覧するといった操作をユーザーができる画面を提供するアプリケーション コンポーネントです。 48 49各アクティビティには、ユーザー インターフェースを描画できるウィンドウがあります。一般的にはウィンドウは画面と同じ大きさになりますが、画面より小さくしたり、他のウィンドウ上にフローティングさせたりすることもできます。 50 51</p> 52 53<p> 通常、アプリケーションは複数のアクティビティで構成されており、各アプリケーションはそれぞれ緩やかにつながっています。 54一般的には、アプリケーションの 1 つのアクティビティが「メイン」アクティビティとして指定され、ユーザーが初めてアプリケーションを起動したときに表示されるのがこのアクティビティになります。 55その後、各アクティビティで別のアクティビティを開始して別の操作を実行できます。 56新しいアクティビティの開始時には、前のアクティビティは停止しますが、そのアクティビティはシステムによってスタック(「バックスタック」)に維持されます 57 58新しいアクティビティが開始すると、それがバックスタックに入ってユーザーに表示されます。 59バックスタックは「後入れ先出し」の基本的なスタック メカニズムを順守するため、ユーザーが現在のアクティビティを完了して [<em>戻る</em>] ボタンを押すと、そのアクティビティはスタックから消え(破棄され)、前のアクティビティが再開します。 60 61(バックスタックの詳細については、<a href="{@docRoot}guide/components/tasks-and-back-stack.html">タスクとバックスタック</a>ドキュメントで説明します)。 62 63</p> 64 65<p>新しいアクティビティが開始したことで、別のアクティビティが停止した場合、その状態の変化がアクティビティのライフサイクル コールバック メソッド経由で通知されます。システムがアクティビティを作成しているのか、停止しているのか、再開しているのか、破棄しているのかという状態の変化によって、アクティビティが受け取るコールバック メソッドにはいくつかの種類があり、各コールバックではユーザーがその状態の変化に応じた特定の操作を実行できます。 66 67 68—— 69 70たとえば、アクティビティが停止した場合は、ネットワーク接続やデータベース接続などの大きなオブジェクトを解放することになります。 71アクティビティが再開した場合は、必要なリソースを再度取得し、中断したところから操作を再開できます。 72このような状態の推移はすべて、アクティビティのライフサイクルの一部です。 73</p> 74 75<p>このドキュメントでは、さまざまなアクティビティの状態間の切り替えを正しく管理できるよう、アクティビティのライフサイクルの仕組みについてさらに詳しく説明する他、アクティビティのビルド方法と使用方法の基本について解説します。 76 77</p> 78 79 80 81<h2 id="Creating">アクティビティを作成する</h2> 82 83<p>アクティビティを作成するには、{@link android.app.Activity} のサブクラス(またはその既存のサブクラス)を作成する必要があります。 84サブクラスでは、アクティビティのライフサイクルの状態の切り替え時(アクティビティの作成、停止、再開、破棄など)にシステムが呼び出すコールバック メソッドを実装する必要があります。 85 86最も重要なコールバック メソッドは次の 2 つです。 87</p> 88 89<dl> 90 <dt>{@link android.app.Activity#onCreate onCreate()}</dt> 91 <dd>このメソッドは必ず実装してください。システムはアクティビティ作成の際にこのメソッドを呼び出します。 92実装の際には、アクティビティの必須コンポーネントを初期化する必要があります。 93 94 さらに重要な点は、ここで {@link android.app.Activity#setContentView 95 setContentView()} を呼び出してアクティビティのユーザー インターフェースのレイアウトを定義する必要があるということです。</dd> 96 <dt>{@link android.app.Activity#onPause onPause()}</dt> 97 <dd>システムは、ユーザーがアクティビティを終了したことを始めて示すときに、このメソッドを呼び出します(アクティビティが破棄されていない場合も含む)。 98通常はここで、現在のユーザー セッション後も維持する必要のある変更点を保存しておきます(ユーザーが戻ってこない可能性があるため)。 99 100</dd> 101</dl> 102 103<p>アクティビティ間の滑らかな操作感を実現し、アクティビティが停止したり破棄されたりする可能性のある予想外の中断に対応するために使用できるライフサイクル コールバック メソッドは他にもいくつかあります。 104 105すべてのライフサイクル コールバック メソッドについては、<a href="#Lifecycle">アクティビティのライフサイクルを管理する</a>のセクションで説明します。 106</p> 107 108 109 110<h3 id="UI">ユーザー インターフェースを実装する</h3> 111 112<p> アクティビティのユーザー インターフェースは、ビューの階層、 {@link android.view.View} から派生したオブジェクトから提供されます。— 113各ビューはアクティビティ ウィンドウ内の特定の長方形のエリアを制御し、ユーザーの操作に応答します。 114たとえば、1 つのビューが、ユーザーがタップしたときに操作を開始するボタンである場合があります。 115</p> 116 117<p>Android には、レイアウトのデザインや整理に使用できる既成のビューが多数用意されています。 118「ウィジェット」は、ボタン、テキスト フィールド、チェックボックス、画像といった画像の視覚的(操作可能な)要素を提供するビューです。 119「レイアウト」は、{@link 120android.view.ViewGroup} から派生したビューで、線形レイアウト、グリッド レイアウト、相対レイアウトなど、子ビューの特有のレイアウト モデルを提供するものです。 121また、{@link android.view.View} クラスと {@link android.view.ViewGroup} クラス(または既存のサブクラス)のサブクラスを作成し、独自のウィジェットやレイアウトを作ってアクティビティのレイアウトに適用することもできます。 122 123</p> 124 125<p>ビューを使用したレイアウトの定義で最も一般的なのは、XML レイアウト ファイルをアプリケーション リソースに保存する方法です。 126この方法では、ユーザー インターフェースのデザインを、アクティビティの挙動を定義するソース コードとは別に維持できます。 127{@link android.app.Activity#setContentView(int) setContentView()} を使用して、レイアウトのリソース ID を渡すと、アクティビティの UI としてレイアウトを設定できます。 128 129ただし、アクティビティ コードに新しい {@link android.view.View} を作成して、{@link android.view.ViewGroup} に新しい {@link 130android.view.View} を挿入してビュー階層をビルドし、ルートの {@link android.view.ViewGroup} を {@link android.app.Activity#setContentView(View) 131setContentView()} に渡して、そのレイアウトを使うこともできます。 132 133</p> 134 135<p>ユーザー インターフェースの作成の詳細については、「<a href="{@docRoot}guide/topics/ui/index.html">ユーザー インターフェース</a>」のドキュメントをご覧ください。</p> 136 137 138 139<h3 id="Declaring">マニフェストでアクティビティを宣言する</h3> 140 141<p>アクティビティがシステムにアクセスできるようにするには、マニフェストでアクティビティを宣言する必要があります。 142アクティビティを宣言するには、マニフェスト ファイルを開いて、<a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a> 要素を <a href="{@docRoot}guide/topics/manifest/application-element.html">{@code <application>}</a> の子要素として追加します。 143 144次に例を示します。</p> 145 146<pre> 147<manifest ... > 148 <application ... > 149 <activity android:name=".ExampleActivity" /> 150 ... 151 </application ... > 152 ... 153</manifest > 154</pre> 155 156<p>この要素には他にも、アクティビティのラベル、アクティビティのアイコン、アクティビティの UI を決めるテーマなどのプロパティを定義する属性を含めることができます。<a href="{@docRoot}guide/topics/manifest/activity-element.html#nm">{@code android:name}</a> 属性は、アクティビティのクラス名を指定するもので、唯一の必須属性です。 157 158 159—アプリケーションを発行したら、この名前は変更できません。変更すると、アプリケーションのショートカットなどの一部の機能が破損する可能性があります(ブログの投稿「<a href="http://android-developers.blogspot.com/2011/06/things-that-cannot-change.html">Things That Cannot Change</a>」をご覧ください)。 160 161 162</p> 163 164<p>マニフェストでのアクティビティの宣言に関する詳細については、<a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a> 要素のリファレンスをご覧ください。 165</p> 166 167 168<h4>インテント フィルタを使用する</h4> 169 170<p><a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code 171<activity>}</a> 要素でも — <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code 172<intent-filter>}</a> 要素を使用してさまざまなインテント フィルタを指定して — 他のアプリケーション コンポーネントでのアクティベート方法を宣言できます。 173</p> 174 175<p>Android SDK ツールを使用して新しいアプリケーションを作成する際、自動的に作成されるスタブ アクティビティには、「メイン」アクションに応答するアクティビティで、「ランチャー」カテゴリに置かれるべきものを宣言するインテント フィルタが含まれます。 176 177インテント フィルタは次のように表示されます。 178</p> 179 180<pre> 181<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon"> 182 <intent-filter> 183 <action android:name="android.intent.action.MAIN" /> 184 <category android:name="android.intent.category.LAUNCHER" /> 185 </intent-filter> 186</activity> 187</pre> 188 189<p><a href="{@docRoot}guide/topics/manifest/action-element.html">{@code 190<action>}</a> 要素は、これがアプリケーションへの「メイン」エントリ ポイントであることを指定します。<a href="{@docRoot}guide/topics/manifest/category-element.html">{@code 191<category>}</a> 要素は、アクティビティをシステムのアプリケーション ランチャーに入れるべきであると指定します(ユーザーがこのアクティビティを起動できるようにします)。 192</p> 193 194<p>アプリケーションを自己完結型にして、他のアプリケーションでアクティビティをアクティベートできないようにする場合は、他のインテント フィルタは必要ありません。 195前の例のように、「メイン」アクションを持ち、「ランチャー」カテゴリにできるのは 1 つのアクティビティのみです。 196アクティビティを他のアプリケーションで利用できないようにする場合は、そのアクティビティにはインテント フィルタを使用せず、明示的なインテントを使用して自身でアクティビティを開始するようにできます(次のセクションで説明します)。 197 198</p> 199 200<p>ただし、他のアプリケーション(と自身のアプリケーション)から派生した暗黙的なインテントにアクティビティが応答するようにする場合は、アクティビティで追加のインテント フィルタを定義する必要があります。 201 202応答するインテントのタイプごとに、<a href="{@docRoot}guide/topics/manifest/action-element.html">{@code 203<action>}</a> 要素を含む <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code 204<intent-filter>}</a> と、任意で <a href="{@docRoot}guide/topics/manifest/category-element.html">{@code 205<category>}</a> 要素や <a href="{@docRoot}guide/topics/manifest/data-element.html">{@code 206<data>}</a> 要素を含める必要があります。 207これらの要素は、アクティビティが応答できるインテントのタイプを指定します。 208</p> 209 210<p>アクティビティがインテントに応答する方法の詳細については、「<a href="{@docRoot}guide/components/intents-filters.html">インテントとインテント フィルタ</a>」のドキュメントをご覧ください。 211</p> 212 213 214 215<h2 id="StartingAnActivity">アクティビティを開始する</h2> 216 217<p>@link android.app.Activity#startActivity 218 startActivity()} を呼び出して、開始するアクティビティを記述する {@link android.content.Intent} を渡すと、新しいアクティビティを開始できます。 219インテントは開始するアクティビティを正確に指定するか、実行する操作のタイプを記述します(システムが適切なアクティビティを選択しますが、それが他のアプリケーションのアクティビティである場合もあります)。 220 221 222また、インテントには開始したアクティビティで使用する少量のデータを含めることもできます。 223</p> 224 225<p>自身のアプリケーションを操作するとき、既知のアクティビティを起動することが頻繁にあります。 226 そのような場合、クラス名を使用して開始するアクティビティを明示的に定義するインテントを作成できます。 227例として、1 つのアクティビティで {@code 228SignInActivity} という名前の他のアクティビティを開始する方法を次に示します。</p> 229 230<pre> 231Intent intent = new Intent(this, SignInActivity.class); 232startActivity(intent); 233</pre> 234 235<p>ただし、アクティビティからのデータを使用して、アプリケーションでメールやテキスト メッセージの送信、ステータスのアップデートといった操作を実行する場合もあります。 236アプリケーションにそのような操作を実行できるアクティビティがない場合、代わりに、端末上の他のアプリケーションによるアクティビティを活用できます。 237 238ここが、インテントがその存在意義を発揮する場面です。実行する操作を記述するインテントを作成し、システムが適切なアクティビティを他のアプリケーションから起動します。 239— 240 241インテントを処理できるアクティビティが複数ある場合は、使用するアクティビティを 1 つユーザーが選択できます。 242たとえば、メールを送信できるようにする場合は、次のようなインテントを作成します。 243 244</p> 245 246<pre> 247Intent intent = new Intent(Intent.ACTION_SEND); 248intent.putExtra(Intent.EXTRA_EMAIL, recipientArray); 249startActivity(intent); 250</pre> 251 252<p>インテントに追加された {@link android.content.Intent#EXTRA_EMAIL} のエクストラは、メールの送信先となるメールアドレスの文字列配列です。 253メール アプリケーションがこのインテントに応答するとき、エクストラにある文字列配列を読み取り、それをメール作成フォームの「宛先」フィールドに置きます。 254 255この場合、メール アプリケーションのアクティビティが開始してユーザーが操作を完了したときにアクティビティが再開します。 256</p> 257 258 259 260 261<h3 id="StartingAnActivityForResult">結果待ちのアクティビティを開始する</h3> 262 263<p>開始するアクティビティから結果を受け取りたい場合は、{@link android.app.Activity#startActivityForResult 264 startActivityForResult()}({@link android.app.Activity#startActivity 265 startActivity()} の代わりに)を呼び出してアクティビティを開始します。 266その後のアクティビティから結果を受け取るには、 267{@link android.app.Activity#onActivityResult onActivityResult()} コールバック メソッドを実装します。 268後続のアクティビティが完了すると、{@link 269android.content.Intent} の結果を {@link android.app.Activity#onActivityResult onActivityResult()} メソッドに返します。 270</p> 271 272<p>たとえば、連絡先を 1 つ受け取って、アクティビティでその連絡先情報を使用する場合は、 273次のようにインテントを作成して結果を処理できます。 274</p> 275 276<pre> 277private void pickContact() { 278 // Create an intent to "pick" a contact, as defined by the content provider URI 279 Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI); 280 startActivityForResult(intent, PICK_CONTACT_REQUEST); 281} 282 283@Override 284protected void onActivityResult(int requestCode, int resultCode, Intent data) { 285 // If the request went well (OK) and the request was PICK_CONTACT_REQUEST 286 if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) { 287 // Perform a query to the contact's content provider for the contact's name 288 Cursor cursor = getContentResolver().query(data.getData(), 289 new String[] {Contacts.DISPLAY_NAME}, null, null, null); 290 if (cursor.moveToFirst()) { // True if the cursor is not empty 291 int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME); 292 String name = cursor.getString(columnIndex); 293 // Do something with the selected contact's name... 294 } 295 } 296} 297</pre> 298 299<p>この例では、アクティビティの結果を処理するために {@link 300android.app.Activity#onActivityResult onActivityResult()} メソッドで使用すべき基本ロジックを示しています。 3011 つ目の条件では、要求が成功したかどうかを確認し、成功した場合は {@code resultCode} が{@link android.app.Activity#RESULT_OK} になり、この結果への要求が応答しているかどうかが判明します。この場合、{@code requestCode} が {@link android.app.Activity#startActivityForResult 302startActivityForResult()} で送信された 2 つ目のパラメータに一致しています。— 303—— 304 305そこから、コードが {@link android.content.Intent}({@code data} パラメータ)に返されたデータを照会することでアクティビティの結果を処理します。 306</p> 307 308<p>ここで、{@link 309android.content.ContentResolver} がコンテンツ プロバイダに対してクエリを実行し、照会されたデータを読み取れるようにする {@link android.database.Cursor} が返されます。 310詳細については、「<a href="{@docRoot}guide/topics/providers/content-providers.html">コンテンツ プロバイダ</a>」のドキュメントをご覧ください。 311</p> 312 313<p>インテントの使用に関する詳細については、「<a href="{@docRoot}guide/components/intents-filters.html">インテントとインテント フィルタ</a>」のドキュメントをご覧ください。 314</p> 315 316 317<h2 id="ShuttingDown">アクティビティをシャットダウンする</h2> 318 319<p>アクティビティは、{@link android.app.Activity#finish 320finish()} メソッドを呼び出すことでシャットダウンできます。また、{@link android.app.Activity#finishActivity finishActivity()} を呼び出すと以前に開始した別のアクティビティをシャットダウンすることもできます。 321</p> 322 323<p class="note"><strong>注:</strong> ほとんどの場合、これらのメソッドを用いてアクティビティを明示的に終了しないでください。 324後述のアクティビティのライフサイクルでも説明していますが、Android システム自体がアクティビティのライフサイクルを管理するため、アクティビティを自身で終了させる必要はありません。 325 326これらのメソッドを呼び出すと、期待された操作性に影響を与えることがあるため、ユーザーが絶対にアクティビティのこのインスタンスに戻らないようにする場合にのみ使用するようにしてください。 327 328</p> 329 330 331<h2 id="Lifecycle">アクティビティのライフサイクルを管理する</h2> 332 333<p>コールバック メソッドを実装したアクティビティのライフサイクルの管理は、強固で柔軟なアプリケーションの開発にとって重要です。 334 335アクティビティのライフサイクルは、他のアクティビティ、タスク、バックスタックとの関連による影響を直接受けます。 336</p> 337 338<p>基本的に、アクティビティには次の 3 つの状態があります。</p> 339 340<dl> 341 <dt><i>再開状態</i></dt> 342 <dd>アクティビティが画面のフォアグラウンドにあり、ユーザー フォーカスのある状態。(この状態は「実行中」とも呼ばれます)。 343</dd> 344 345 <dt><i>一時停止状態</i></dt> 346 <dd>他のアクティビティがフォアグラウンドにあり、メインに表示されているが、このアクティビティも表示されている。つまり、このアクティビティの上に他のアクティビティが表示されており、他方のアクティビティは一部が透明であるか、画面全体を覆ってはいない状態です。 347 348一時停止状態のアクティビティは完全に生きている状態ですが({@link android.app.Activity} オブジェクトがメモリに保持されており、すべての状態やメンバー情報が維持され、ウィンドウ マネージャーにもアタッチされたまま)、メモリ量が極端に低下した場合にはシステムによって強制停止される場合もあります。 349 350</dd> 351 352 <dt><i>停止状態</i></dt> 353 <dd>アクティビティは、他のアクティビティによって完全に見えない状態です(アクティビティが「バックグラウンド」にある)。 354停止状態のアクティビティもまだ生きていますが({@link android.app.Activity} オブジェクトがメモリに保持されており、すべての状態やメンバー情報が維持されているが、ウィンドウ マネージャーにはアタッチ<em>されていない</em>状態です)。 355 356ただし、ユーザーには表示されておらず、別の場所でメモリが必要になればシステムによって強制終了される場合もあります。 357</dd> 358</dl> 359 360<p>アクティビティが一時停止か停止状態の場合、システムはアクティビティに終了するかどうかを尋ねる({@link android.app.Activity#finish finish()} メソッドを呼び出す)か、単純にプロセスを強制終了してメモリから解放できます。 361 362アクティビティを再度開くとき(終了や強制終了後)は、もう一度最初から作成する必要があります。 363</p> 364 365 366 367<h3 id="ImplementingLifecycleCallbacks">ライフサイクル コールバックを実装する</h3> 368 369<p>アクティビティが上記の異なる状態の間を遷移するとき、さまざまなコールバック メソッドを介して通知されます。 370すべてのコールバック メソッドは、アクティビティの状態が変化したときに必要な操作を実行するようオーバーライドできるフックになります。 371次のスケルトン アクティビティには、基本的なライフサイクル メソッドがそれぞれ含まれています。 372</p> 373 374 375<pre> 376public class ExampleActivity extends Activity { 377 @Override 378 public void {@link android.app.Activity#onCreate onCreate}(Bundle savedInstanceState) { 379 super.onCreate(savedInstanceState); 380 // The activity is being created. 381 } 382 @Override 383 protected void {@link android.app.Activity#onStart onStart()} { 384 super.onStart(); 385 // The activity is about to become visible. 386 } 387 @Override 388 protected void {@link android.app.Activity#onResume onResume()} { 389 super.onResume(); 390 // The activity has become visible (it is now "resumed"). 391 } 392 @Override 393 protected void {@link android.app.Activity#onPause onPause()} { 394 super.onPause(); 395 // Another activity is taking focus (this activity is about to be "paused"). 396 } 397 @Override 398 protected void {@link android.app.Activity#onStop onStop()} { 399 super.onStop(); 400 // The activity is no longer visible (it is now "stopped") 401 } 402 @Override 403 protected void {@link android.app.Activity#onDestroy onDestroy()} { 404 super.onDestroy(); 405 // The activity is about to be destroyed. 406 } 407} 408</pre> 409 410<p class="note"><strong>注:</strong> これらのライフサイクル メソッドを実装する際は、上記の例のように、すべての操作の前にスーパークラスの実装を呼び出す必要があります。 411</p> 412 413<p>これらのメソッドすべてで、アクティビティのライフサイクル全体を定義します。これらのメソッドを実装すると、アクティビティのライフサイクル内の次の 3 つのネストされたループを監視できます。 414 </p> 415 416<ul> 417<li>アクティビティの<b> entire lifetime</b> は、{@link 418android.app.Activity#onCreate onCreate()} の呼び出しから、{@link 419android.app.Activity#onDestroy} の呼び出しまでの間です。アクティビティは、{@link android.app.Activity#onCreate onCreate()} で「グローバル」状態のセットアップ(レイアウトの定義など)を実行し、{@link android.app.Activity#onDestroy} に残っているすべてのリソースを解放する必要があります。 420 421たとえば、アクティビティにネットワークからデータをダウンロードするためバックグラウンドで実行しているスレッドがある場合、そのスレッドが {@link android.app.Activity#onCreate onCreate()} に作成され、{@link 422android.app.Activity#onDestroy} のスレッドが停止される場合があります。 423 424</li> 425 426<li><p>アクティビティの<b>visible lifetime</b> は、{@link 427android.app.Activity#onStart onStart()} の呼び出しから、{@link 428android.app.Activity#onStop onStop()} の呼び出しまでの間です。この間、アクティビティは画面上に表示され、ユーザーが操作できる状態です。 429たとえば {@link android.app.Activity#onStop onStop()} は、新たなアクティビティが開始してこのアクティビティが表示されなくなったときに呼び出されます。 430これらの 2 つのメソッド間で、アクティビティをユーザーに表示するのに必要なリソースは保持できます 431たとえば、{@link android.content.BroadcastReceiver} を {@link 432android.app.Activity#onStart onStart()} に登録して UI に影響のある変更を監視し、ユーザーが表示内容の閲覧をやめたときに {@link android.app.Activity#onStop onStop()} で登録解除できます 433 434 435アクティビティがユーザーに表示されたり、非表示になったりとアクティビティの状態が変化する場合、アクティビティの entire lifetime 中にシステムが {@link android.app.Activity#onStart onStart()} と {@link 436android.app.Activity#onStop onStop()} を複数回呼び出すこともあります。 437</p></li> 438 439<li><p>アクティビティの <b>foreground lifetime</b> は {@link 440android.app.Activity#onResume onResume()} の呼び出しから、{@link android.app.Activity#onPause 441onPause()} の呼び出しまでの間です。この間、アクティビティは画面上の他のすべてのアクティビティの前面にあり、ユーザーの入力フォーカスがある状態です。 442アクティビティは フォアグラウンドにある状態からそうでない状態に頻繁に遷移する可能性があります。たとえば、端末がスリープ状態になったり、ダイアログが表示されたりしたときには{@link android.app.Activity#onPause onPause()} が呼び出されます。 443— 444この状態遷移は頻繁に起こるため、この 2 つのメソッドのコードはユーザーを待たせてしまうような遅い遷移にならないよう、適正な軽い処理にしておく必要があります。 445</p></li> 446</ul> 447 448<p>図 1 では、状態間でアクティビティがたどる可能性のあるループと経路を表しています。長方形はアクティビティが状態間で遷移したときの処理用に実装できるコールバック メソッドを表しています。 449 450 <p> 451 452<img src="{@docRoot}images/activity_lifecycle.png" alt="" /> 453<p class="img-caption"><strong>図 1.</strong> アクティビティのライフサイクル</p> 454 455<p>表 1 には同じライフサイクル コールバック メソッドがリストされており、各コールバック メソッドの詳細と、アクティビティのライフサイクル全体でのそれぞれの位置関係、コールバック メソッドの完了後にシステムによってアクティビティが強制終了されるかどうかを示しています。 456 457 458</p> 459 460<p class="table-caption"><strong>表 1.</strong> ライフサイクル コールバック メソッドの概要 461</p> 462 463<table border="2" width="85%" frame="hsides" rules="rows"> 464<colgroup align="left" span="3"></colgroup> 465<colgroup align="left"></colgroup> 466<colgroup align="center"></colgroup> 467<colgroup align="center"></colgroup> 468 469<thead> 470<tr><th colspan="3">メソッド</th> <th>説明</th> <th>完了後の強制終了</th> <th>次のメソッド</th></tr> 471</thead> 472 473<tbody> 474<tr> 475 <td colspan="3" align="left"><code>{@link android.app.Activity#onCreate onCreate()}</code></td> 476 <td>アクティビティが最初に作成されるときに呼び出されます。 477 ここで、ビューの作成、リストとのデータバインドといった、通常の静的なセットアップを行います。— 478アクティビティの前の状態を含む Bundle オブジェクトを取り出せた場合、それをメソッドに渡します(後半の<a href="#actstate">アクティビティの状態を保存する</a>をご覧ください)。 479 480 481 482 <p>常に {@code onStart()} が後に続きます。</p></td> 483 <td align="center">いいえ</td> 484 <td align="center">{@code onStart()}</td> 485</tr> 486 487<tr> 488 <td rowspan="5" style="border-left: none; border-right: none;"> </td> 489 <td colspan="2" align="left"><code>{@link android.app.Activity#onRestart 490onRestart()}</code></td> 491 <td>アクティビティが停止した後、再開する直前に呼び出されます。 492 493 <p>常に {@code onStart()} が後に続きます。</p></td> 494 <td align="center">いいえ</td> 495 <td align="center">{@code onStart()}</td> 496</tr> 497 498<tr> 499 <td colspan="2" align="left"><code>{@link android.app.Activity#onStart onStart()}</code></td> 500 <td>アクティビティがユーザーに見える状態になる直前に呼び出されます。 501 <p>アクティビティがフォアグラウンドになったときは {@code onResume()} が後に続き、アクティビティが非表示になったときは {@code onStop()} が後に続きます。 502</p></td> 503 <td align="center">いいえ</td> 504 <td align="center">{@code onResume()} <br/>または<br/> {@code onStop()}</td> 505</tr> 506 507<tr> 508 <td rowspan="2" style="border-left: none;"> </td> 509 <td align="left"><code>{@link android.app.Activity#onResume onResume()}</code></td> 510 <td>アクティビティとユーザーとの操作が開始する直前に呼び出されます。 511この時点で、アクティビティはアクティビティ スタックの先頭にあり、ユーザー入力の準備ができています。 512 513 <p>常に {@code onPause()} が後に続きます。</p></td> 514 <td align="center">いいえ</td> 515 <td align="center">{@code onPause()}</td> 516</tr> 517 518<tr> 519 <td align="left"><code>{@link android.app.Activity#onPause onPause()}</code></td> 520 <td>システムが別のアクティビティを再開する直前に呼び出されます。 521通常、このメソッドは永続化データへの未保存の変更をコミットしたり、アニメーションや CPU を消費する可能性のあるその他の動作を停止したりする際に使用されます。 522 523それが完了するまで次のアクティビティが再開できないため、それらの操作は迅速に行う必要があります。 524 525 <p>アクティビティが前面に戻るときは {@code onResume()} が後に続き、アクティビティが非表示になるときは {@code onStop()} が後に続きます。 526 527</td> 528 <td align="center"><strong style="color:#800000">はい</strong></td> 529 <td align="center">{@code onResume()} <br/>または<br/> {@code onStop()}</td> 530</tr> 531 532<tr> 533 <td colspan="2" align="left"><code>{@link android.app.Activity#onStop onStop()}</code></td> 534 <td>アクティビティがユーザーに見えなくなると呼び出されます。これは、アクティビティが破棄されたか、別のアクティビティ(既存のアクティビティや新しいアクティビティ)が再開されてこのアクティビティを覆っている場合に起こります。 535 536 537 <p>アクティビティのユーザー操作が可能に戻るときは {@code onRestart()} が後に続き、アクティビティがなくなるときは {@code onDestroy()} が後に続きます。 538 539</p></td> 540 <td align="center"><strong style="color:#800000">はい</strong></td> 541 <td align="center">{@code onRestart()} <br/>または<br/> {@code onDestroy()}</td> 542</tr> 543 544<tr> 545 <td colspan="3" align="left"><code>{@link android.app.Activity#onDestroy 546onDestroy()}</code></td> 547 <td>アクティビティが破棄される前に呼び出されます。これはアクティビティが受け取る最後の呼び出しです。 548アクティビティが終了した(<code>{@link android.app.Activity#finish 549 finish()}</code> が呼び出された)か、アクティビティ領域を節約するためにシステムが一時的にこのアクティビティを破棄した場合に呼び出されます。 550 551この 2 つのシナリオは、<code>{@link 552 android.app.Activity#isFinishing isFinishing()}</code> メソッドで区別できます。 553</td> 554 <td align="center"><strong style="color:#800000">はい</strong></td> 555 <td align="center"><em>なし</em></td> 556</tr> 557</tbody> 558</table> 559 560<p>「完了後の強制終了」の列は、<em>メソッドが戻った後</em>に、アクティビティのコードの後続行を実行することなく、アクティビティをホストするプロセスをシステムが強制終了できるかどうかを示しています。 561 5623 つのメソッド({@link 563android.app.Activity#onPause 564onPause()}、{@link android.app.Activity#onStop onStop()}、{@link android.app.Activity#onDestroy 565onDestroy()})が「はい」になっています。{@link android.app.Activity#onPause onPause()} は 3 つのなかで最初であるため、アクティビティが作成された後は{@link android.app.Activity#onPause onPause()} がプロセスが強制終了される<em>可能性がある</em>前に呼び出されることが保証される最後のメソッドです。システムが緊急でメモリを空ける必要がある場合は、{@link 566android.app.Activity#onStop onStop()} と {@link android.app.Activity#onDestroy onDestroy()} は呼び出されない場合があります。 567 568— 569 570そのため、重要な永続的データ(ユーザーの編集内容など)をストレージに書き込む際は、{@link android.app.Activity#onPause onPause()} を使用する必要があります。 571ただし、このメソッドで後続のアクティビティへの遷移をブロックしてしまい、ユーザー操作の速度を送らせてしまうことから、{@link android.app.Activity#onPause onPause()} 中にどんな情報を保持するかについては吟味する必要があります。 572 573 574</p> 575 576<p> <b>「強制終了」</b>列で「いいえ」となっているメソッドでは、アクティビティが呼び出された時点から、アクティビティをホストするプロセスが強制終了されないよう保護します。 577つまり、アクティビティが強制終了される可能性があるのは、{@link android.app.Activity#onPause onPause()} が戻ってから、{@link android.app.Activity#onResume onResume()} が呼び出されるまでの間です。 578 579{@link android.app.Activity#onPause onPause()} が再度呼び出されて戻るまでは、再度強制終了されることはありません。 580 </p> 581 582<p class="note"><strong>注:</strong> 表 1 の定義では技術的に「強制終了」できないアクティビティでも、システムによって強制終了されることがありますが、そうなるのはリソース不足などの緊急時のみです。 583— 584アクティビティが強制終了されるケースについては、<a href="{@docRoot}guide/components/processes-and-threads.html">Processes and Threading</a> のドキュメントで説明しています。 585 586</p> 587 588 589<h3 id="SavingActivityState">アクティビティの状態を保存する</h3> 590 591<p><a href="#Lifecycle">アクティビティのライフサイクルを管理する</a>でも簡単に説明したように、アクティビティが一時停止や停止したとき、アクティビティの状態は保持されます。 592 593これは、一時停止や停止されたときも {@link android.app.Activity} オブジェクトがメモリに保持されるためです — メンバーや現在の状態といったすべての情報は残っています。 594 595つまり、アクティビティ内でユーザーが加えた変更点は保持されるため、アクティビティがフォアグラウンドに戻ったとき(「再開」したとき)、それらの変更点はそのまま表示されます。 596 597</p> 598 599<p>ただし、メモリを確保するためにシステムがアクティビティを破棄すると、 {@link 600android.app.Activity} オブジェクトが破棄されるため、システムはそれをそのままの状態で再開できなくなります。 601代わりに、ユーザーがそれに戻る操作を行った場合、システムは {@link android.app.Activity} オブジェクトを再作成します。 602ユーザーにはシステムがアクティビティを破棄して再作成したことはわからないため、アクティビティが以前の状態のままであることを期待します。 603 604この場合、アクティビティの状態情報を保存できる追加のコールバック メソッド({@link 605android.app.Activity#onSaveInstanceState onSaveInstanceState()})を実装することで、アクティビティの状態に関する重要な情報を維持できます。 606 607</p> 608 609<p>アクティビティが破棄されるような状態になる前に、システムが {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} を呼び出します。 610システムはこのメソッドを {@link android.os.Bundle} に渡し、そこでアクティビティの状態情報を名前と値のペアとして {@link 611android.os.Bundle#putString putString()} や {@link 612android.os.Bundle#putInt putInt()} などのメソッドを使用して保存できます。 613 614その後、システムがアプリケーション プロセスを強制終了して、ユーザーがアクティビティに戻った場合、システムはアクティビティを再作成して {@link android.os.Bundle} を {@link android.app.Activity#onCreate onCreate()} と {@link 615android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} の両方に渡します。 616 617いずれのメソッドを使った場合でも、保存した状態を {@link android.os.Bundle} から抽出してアクティビティの状態を復元できます。 618 619復元する状態情報がない場合は、{@link 620android.os.Bundle} は null で渡されます(アクティビティを最初に作成した場合がこれにあたります)。 621</p> 622 623<img src="{@docRoot}images/fundamentals/restore_instance.png" alt="" /> 624<p class="img-caption"><strong>図 2.</strong> アクティビティが前の状態のままでユーザー フォーカスに戻るには、アクティビティが破棄され、再作成された後にアクティビティが保存された以前の状態を復元する必要があるか、アクティビティが停止し、再開した後にアクティビティの状態が以前のままになるか、の 2 つの方法があります。 625 626 627</p> 628 629<p class="note"><strong>注:</strong> アクティビティが破棄される前に {@link 630android.app.Activity#onSaveInstanceState onSaveInstanceState()} が呼び出される保証はありません。これは、状態を保存する必要がないケースがあるためです(ユーザーが [<em>戻る</em>] ボタンを使用してアクティビティを離れることで明示的にアクティビティを閉じた場合など)。 631 632 633 634システムが {@link android.app.Activity#onSaveInstanceState 635onSaveInstanceState()} を呼び出す場合、呼び出しは常に {@link 636android.app.Activity#onStop onStop()} の前、場合によっては {@link android.app.Activity#onPause 637onPause()} の前に行われます。</p> 638 639<p>ただし、何もせず {@link 640android.app.Activity#onSaveInstanceState onSaveInstanceState()} も実装しない場合でも、{@link android.app.Activity} クラスの {@link 641android.app.Activity#onSaveInstanceState onSaveInstanceState()} のデフォルトの実装によって、アクティビティの状態が復元されるものもあります。 642具体的には、デフォルトの実装がレイアウト内のすべての {@link 643android.view.View} の {@link 644android.view.View#onSaveInstanceState onSaveInstanceState()} を呼び出すことで、各ビューが保存すべき情報を提供できるようになります。 645 646Android フレームワークの大半のウィジェットが必要に応じてこのメソッドを実装しており、UI への視覚的な変更は自動的に保存され、アクティビティが再作成されると復元されるようになっています。 647 648たとえば、{@link android.widget.EditText} ウィジェットではユーザーが入力したすべてのテキストを保存し、{@link android.widget.CheckBox} ウィジェットはオンにされたかどうかを保存するようになっています。 649 650ここで必要な作業は、状態を保存する各ウィジェット用の一意の ID(<a href="{@docRoot}guide/topics/resources/layout-resource.html#idvalue">{@code android:id}</a>)を提供するだけです。 651ウィジェットに ID がないと、システムは状態を保存できません。 652</p> 653 654<div class="sidebox-wrapper"> 655<div class="sidebox"> 656<p>また、レイアウトのビューでの状態の保存を明示的に停止するには、{@link android.R.attr#saveEnabled android:saveEnabled} 属性を {@code "false"} に設定するか、{@link android.view.View#setSaveEnabled setSaveEnabled()} メソッドを呼び出します。 657 658通常はこの機能を無効にしませんが、アクティビティ UI の状態を別の方法で復元する場合には無効にできます。 659</p> 660</div> 661</div> 662 663<p>{@link 664android.app.Activity#onSaveInstanceState onSaveInstanceState()} のデフォルトの実装によってアクティビティの UI に関する有用な情報は保存されますが、追加の情報を保存するようそれをオーバーライドすることもできます。例としては、アクティビティの期間に変更されたメンバー値を保存する必要があるケースなどがあります。(UI で復元された値に関連している場合でも、それらの UI 値を持つメンバーはデフォルトでは復元されません)。 665 666 667 668</p> 669 670<p>{@link 671android.app.Activity#onSaveInstanceState onSaveInstanceState()} のデフォルトの実装で UI の状態を保存できるため、状態の追加情報を保存するようメソッドをオーバーライドする場合は、常に作業前に {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} のスーパークラス実装を呼び出す必要があります。 672 673 674同様に、オーバーライドする場合はデフォルトの実装でビューの状態を復元できるよう、{@link 675android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} のスーパークラスの実装も呼び出す必要があります。 676</p> 677 678<p class="note"><strong>注:</strong> {@link android.app.Activity#onSaveInstanceState 679onSaveInstanceState()} は呼び出される保証がないため、これはアクティビティの一時的な状態の記録用にのみ使用し、永続的データの保存には使用しないようにします。 680 681—代わりに {@link 682android.app.Activity#onPause onPause()} を使用して、ユーザーがアクティビティを離れたときの永続的データ(データベースに保存するインストール必要のあるデータなど)を保存します。 683</p> 684 685<p>アプリケーションが状態を復元できるかどうかテストするには、端末を回転してみて、方向が変化するかを確認します 686画面の方向が変わるとき、システムがアクティビティを破棄して再作成し、新しい画面構成に利用可能な別のリソースを適用します。 687 688アプリケーションの使用中にユーザーが端末を回転させるという場面は日常的にあるため、アクティビティが再作成されたときに状態を完全に復元することは非常に重要です。 689 690</p> 691 692 693<h3 id="ConfigurationChanges">構成の変更を処理する</h3> 694 695<p>端末の構成の中には、実行の際に変化するものがあります(画面の向き、キーボードの可用性、言語など)。 696そのような変化が生じたとき、Android は実行中のアクティビティを再作成します(システムが {@link android.app.Activity#onDestroy} を呼び出し、その後すぐに {@link 697android.app.Activity#onCreate onCreate()})を呼び出します。 698この動作は、提供した別のリソース(異なる画面の向きやサイズに応じたレイアウトなど)を使用してアプリケーションを自動的にリロードすることで、アプリケーションを新しい構成に適応させることを目的としています。 699 700 701</p> 702 703<p>前述のように画面の向きの変化による再起動を処理して、アクティビティの状態を復元するようアプリケーションを適切にデザインしていれば、アプリケーションはアクティビティのライフサイクルでの予期しない他のイベントに対しても回復力を持つことができます。 704 705</p> 706 707<p>このような再起動を処理するのに最適な方法は、前のセクションで説明したように、{@link 708 android.app.Activity#onSaveInstanceState onSaveInstanceState()} と {@link 709android.app.Activity#onRestoreInstanceState onRestoreInstanceState()}(または {@link 710android.app.Activity#onCreate onCreate()})を使用してアクティビティの状態を保存、復元する方法です。 711</p> 712 713<p>実行の際に起こる構成の変更と、その処理方法の詳細については、「<a href="{@docRoot}guide/topics/resources/runtime-changes.html">実行時の変更の処理</a>」のガイドをご覧ください。 714 715</p> 716 717 718 719<h3 id="CoordinatingActivities">アクティビティを連携する</h3> 720 721 <p>1 つのアクティビティで別のアクティビティを開始すると、双方でライフサイクルの遷移が生じます。1 つ目のアクティビティが一時停止したり停止したりすると(バックグラウンドにある場合は停止しません)、もう一方のアクティビティが作成されます。 722 723これらのアクティビティでディスクなどに保存されているデータを共有している場合は、2 つ目のアクティビティが作成される前に 1 つ目のアクティビティが完全に停止することはないということを理解しておくことが重要です。むしろ、2 つ目の開始プロセスは、1 つ目の停止プロセスにオーバーラップします。 724 725 726</p> 727 728<p>特に 2 つのアクティビティが同じプロセスにあって 1 つが別のアクティビティを開始する場合、ライフサイクル コールバックの順序は厳密に定義されています。 729アクティビティ A がアクティビティ B を開始する場合の動作の順序を次に示します。 730 </p> 731 732<ol> 733<li>アクティビティ A の {@link android.app.Activity#onPause onPause()} メソッドが実行されます。</li> 734 735<li>アクティビティ B の {@link android.app.Activity#onCreate onCreate()}、{@link 736android.app.Activity#onStart onStart()}、{@link android.app.Activity#onResume onResume()} メソッドが順次実行されます 737(このとき、ユーザー フォーカスはアクティビティ B にあります)。</li> 738 739<li>次に、アクティビティ A が画面から消えた場合、{@link 740android.app.Activity#onStop onStop()} メソッドが実行されます。</li> 741</ol> 742 743 <p>このライフサイクル コールバックの順序を予測しておくことで、1 つのアクティビティから他のアクティビティへの情報の遷移を管理できるようになります。 744たとえば、1 つ目のアクティビティが停止したときに、後続のアクティビティが読み取れるようにデータベースに書き込む必要がある場合、データベースに書き込むタイミングは {@link 745android.app.Activity#onStop onStop()} ではなく {@link android.app.Activity#onPause onPause()} の間になります。 746 747</p> 748 749<!-- 750<h2>Beginner's Path</h2> 751 752<p>For more information about how Android maintains a history of activities and 753enables user multitasking, continue with the <b><a 754href="{@docRoot}guide/components/tasks-and-back-stack.html">Tasks and Back 755Stack</a></b> document.</p> 756--> 757