1page.title=アクティビティを開始する 2page.tags=アクティビティのライフサイクル 3helpoutsWidget=true 4 5trainingnavtop=true 6 7@jd:body 8 9 10<div id="tb-wrapper"> 11 <div id="tb"> 12 13 <h2>このレッスンでの学習内容</h2> 14<ol> 15 <li><a href="#lifecycle-states">ライフサイクル コールバックを理解する</a></li> 16 <li><a href="#launching-activity">アプリのランチャーのアクティビティを指定する</a></li> 17 <li><a href="#Create">新しいインスタンスを作成する</a></li> 18 <li><a href="#Destroy">アクティビティを破棄する</a></li> 19</ol> 20 21 <h2>関連ドキュメント</h2> 22 <ul> 23 <li><a href="{@docRoot}guide/components/activities.html">アクティビティ</a></li> 24 </ul> 25 26<h2>試してみる</h2> 27 28<div class="download-box"> 29 <a href="http://developer.android.com/shareables/training/ActivityLifecycle.zip" class="button">デモのダウンロード</a> 30 <p class="filename">ActivityLifecycle.zip</p> 31</div> 32 33 </div> 34</div> 35 36<p>{@code main()} メソッドを使用してアプリを起動する他のプログラミング パラダイムとは異なり、Android システムでは、そのライフサイクルの特定の段階に対応する特定のコールバック メソッドを呼び出すことによって、{@link android.app.Activity} インスタンスでコードを開始します。 37 38 39アクティビティを起動するコールバック メソッドのシーケンスと、アクティビティを破棄するコールバック メソッドのシーケンスがあります。 40</p> 41 42<p>このレッスンでは、最も重要なライフサイクル メソッドの概要を示し、アクティビティの新しいインスタンスを作成する最初のライフサイクル コールバックを扱う方法について説明します。 43</p> 44 45 46 47<h2 id="lifecycle-states">ライフサイクル コールバックを理解する</h2> 48 49<p>アクティビティの存続期間において、システムは、階段ピラミッド型のシーケンスで、ライフサイクル メソッドのコア セットを呼び出します。 50つまり、アクティビティのライフサイクルの各段階は、ピラミッドの個別の段です。 51システムが新しいアクティビティのインスタンスを作成すると、各コールバック メソッドはアクティビティ状態を 1 ステップ上に向かって移動させます。 52ピラミッドの頂点は、アクティビティがフォアグラウンドで実行されるポイントであり、ユーザーはそこで操作を行うことができます。 53</p> 54 55<p>ユーザーがアクティビティを離れる操作を始めると、システムはアクティビティを破棄するために、アクティビティ状態をピラミッドの下に向かって移動させる、別のメソッドを呼び出します。 56アクティビティがピラミッドの下に向かって途中まで移動し、待機する場合がありますが(ユーザーが別のアプリに切り替えた場合など)、そのポイントからアクティビティは頂点に戻ることができ(ユーザーがアクティビティに戻った場合)、アクティビティはユーザーが離れた場所から再開します。 57 58 59</p> 60 61 62<img src="{@docRoot}images/training/basics/basic-lifecycle.png" /> 63<p class="img-caption"><strong>図 1.</strong> アクティビティのライフサイクルの簡略図は階段ピラミッドとして表現されます。 64ここでは、アクティビティを頂点の再開状態に向かって 1 ステップ移動させるために使用されるすべてのコールバックに対して、下に向かってアクティビティを移動させるコールバック メソッドがどのように分布しているかを示しています。 65 66アクティビティはまた、一時停止や停止の状態から再開した状態に復帰することができます。 67</p> 68 69 70<p>アクティビティの複雑さにもよりますが、すべてのライフサイクルメソッドを実装する必要はありません。 71ただし、それぞれを理解して、自分のアプリがユーザーの期待どおり動作するよう実装することが重要です。 72アクティビティのライフサイクル メソッドを正しく実装すると、自分のアプリが次を含めたいくつかの状態で良好に動作するようになります。 73</p> 74<ul> 75 <li>アプリの使用中にユーザーが電話を受けたり、別のアプリに切り替えた場合にもクラッシュしません。 76</li> 77 <li>ユーザーの使用頻度が低いときは、貴重なシステムリソースを消費しません。 78</li> 79 <li>ユーザーがアプリから離れ、後で復帰した場合でも、アプリを離れた時点における作業状態を失いません。 80</li> 81 <li>画面の向きが横長と縦長との間で切り替わったときも、クラッシュしたり、ユーザーの作業内容が失われることがありません。 82</li> 83</ul> 84 85<!-- 86<p class="table-caption"><strong>Table 1.</strong> Activity lifecycle state pairs and callback 87methods.</p> 88<table> 89 <tr> 90 <th scope="col">Lifecycle State</th> 91 <th scope="col">Startup Method</th> 92 <th scope="col">Teardown Method</th> 93 </tr> 94 <tr> 95 <td>Created / Destroyed</td> 96 <td>{@link android.app.Activity#onCreate onCreate()}</td> 97 <td>{@link android.app.Activity#onDestroy()}</td> 98 </tr> 99 <tr> 100 <td>Started / Stopped</td> 101 <td>{@link android.app.Activity#onStart()}</td> 102 <td>{@link android.app.Activity#onStop()}</td> 103 </tr> 104 <tr> 105 <td>Resumed / Resumed</td> 106 <td>{@link android.app.Activity#onResume()}</td> 107 <td>{@link android.app.Activity#onPause()}</td> 108 </tr> 109</table> 110--> 111 112<p>次のレッスンで学習するように、図 1 に示されているさまざまな状態間で起きるアクティビティ遷移には、いくつかの状況があります。 113ただし、これらの状態のうち 3 つのみが静的なものとなります。 114すなわち、アクティビティが長期間にわたる場合、3 つの状態のいずれかで存在することになります。 115</p> 116<dl> 117 <dt>再開状態</dt> 118 <dd>この状態では、アクティビティがフォアグラウンドで実行され、ユーザーはそこで操作を行うことができます(「実行」状態とも呼ばれます)。 119</dd> 120 <dt>一時停止状態</dt> 121 <dd>この状態では、アクティビティは別のアクティビティによって部分的に隠されています。フォアグラウンドにある別のアクティビティは半透明になっているか、全画面をカバーしていません。 122一時停止したアクティビティはユーザーの入力を受信せず、一切のコードを実行できません。 123 124 <dt>停止状態</dt> 125 <dd>この状態では、アクティビティは完全に隠され、ユーザーには表示されません。バックグラウンドに存在するとみなされます。 126停止状態の間、アクティビティ インスタンスとメンバ変数のようなそのすべての状態情報は保持されますが、アクティビティ インスタンスは一切のコードを実行できません。 127</dd> 128</dl> 129 130<p>他の状態(作成や起動の状態)は一過性であり、システムはすぐに次のライフサイクル コールバック メソッドを呼び出して、次の状態に移動します。 131つまり、システムは 132{@link android.app.Activity#onCreate onCreate()} を呼び出した後、すぐに {@link 133android.app.Activity#onStart()} を呼び出しますが、この後で速やかに {@link 134android.app.Activity#onResume()} が続きます。</p> 135 136<p>以上が、アクティビティの基本ライフサイクルです。次に、特定のライフサイクルの動作のいくつかについて学習を開始しましょう。 137</p> 138 139 140 141<h2 id="launching-activity">アプリのランチャー アクティビティを指定する</h2> 142 143<p>ユーザーがホーム画面からアプリのアイコンを選択すると、システムはアプリ内で「ランチャー」(または「メイン」)のアクティビティであると宣言された {@link android.app.Activity} に対して {@link 144android.app.Activity#onCreate onCreate()} メソッドを呼び出します。 145これは、アプリのユーザー インターフェースへのメインのエントリ ポイントとして機能するアクティビティです。 146</p> 147 148<p>プロジェクト ディレクトリのルートにある Android のマニフェスト ファイル、<a href="{@docRoot}guide/topics/manifest/manifest-intro.html">{@code AndroidManifest.xml}</a> で、メインのアクティビティとして 149どのアクティビティを使用するが定義することができます。</p> 150 151<p>アプリのメインのアクティビティは、{@link 152android.content.Intent#ACTION_MAIN MAIN} アクションと {@link android.content.Intent#CATEGORY_LAUNCHER LAUNCHER} カテゴリを含む <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code 153<intent-filter>}</a> を使用してマニフェストで宣言する必要があります。 154次に例を示します。</p> 155 156<pre> 157<activity android:name=".MainActivity" android:label="@string/app_name"> 158 <intent-filter> 159 <action android:name="android.intent.action.MAIN" /> 160 <category android:name="android.intent.category.LAUNCHER" /> 161 </intent-filter> 162</activity> 163</pre> 164 165<p class="note"><strong>注:</strong> Android SDK ツールを使用して新しい Android プロジェクトを作成すると、デフォルトのプロジェクト ファイルに、このフィルタを用いてマニフェストで宣言された {@link android.app.Activity} クラスが含まれます。 166 167</p> 168 169<p>自分のアクティビティの 1 つについて、{@link android.content.Intent#ACTION_MAIN MAIN} アクションまたは 170{@link android.content.Intent#CATEGORY_LAUNCHER LAUNCHER} カテゴリのいずれかが宣言されていない場合は、アプリのアイコンがホーム画面のアプリ リストに表示されません。 171</p> 172 173 174 175<h2 id="Create">新しいインスタンスを作成する</h2> 176 177<p>ほとんどのアプリには、ユーザーが異なるアクションを実行できるようにする、いくつかの異なるアクティビティが含まれます。あるアクティビティが、ユーザーがアプリのアイコンをクリックしたときに作成されるメインのアクティビティであっても、ユーザーのアクションに応答してアプリが開始する別のアクティビティであっても、システムはその {@link 178android.app.Activity#onCreate onCreate()} を呼び出すことにより、{@link android.app.Activity} の新しいインスタンスを毎回作成します。 179 180 181</p> 182 183<p>アクティビティの存続期間すべてにわたり、一度のみ発生すべき基本的なアプリの起動ロジックを実行するための 184{@link android.app.Activity#onCreate onCreate()} メソッドを実装する必要があります。たとえば、 185{@link android.app.Activity#onCreate onCreate()} の実装では、ユーザー インターフェースを定義し、場合によってはいくつかのクラススコープの変数をインスタンス化する必要があります。 186</p> 187 188<p>たとえば、{@link android.app.Activity#onCreate onCreate()}メソッドに関する次の例では、(XML レイアウトファイルで定義される)ユーザー インターフェースを宣言したり、メンバ変数を定義したり、UI の一部を構成したりするなどの、アクティビティ用のいくつかの基本的なセットアップを実行する複数のコードを示しています。 189 190 191</p> 192 193<pre> 194TextView mTextView; // Member variable for text view in the layout 195 196@Override 197public void onCreate(Bundle savedInstanceState) { 198 super.onCreate(savedInstanceState); 199 200 // Set the user interface layout for this Activity 201 // The layout file is defined in the project res/layout/main_activity.xml file 202 setContentView(R.layout.main_activity); 203 204 // Initialize member TextView so we can manipulate it later 205 mTextView = (TextView) findViewById(R.id.text_message); 206 207 // Make sure we're running on Honeycomb or higher to use ActionBar APIs 208 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 209 // For the main activity, make sure the app icon in the action bar 210 // does not behave as a button 211 ActionBar actionBar = getActionBar(); 212 actionBar.setHomeButtonEnabled(false); 213 } 214} 215</pre> 216 217<p class="caution"><strong>警告: </strong>{@link android.os.Build.VERSION#SDK_INT} を使用すると、Android 2.0(API レベル 5)以降でのみこの方法で動作する新しい API が古いシステムで実行してしまうことを回避できます。 218 219古いバージョンでは、実行時の例外が発生します。</p> 220 221<p>{@link android.app.Activity#onCreate onCreate()} の実行が終了すると、システムが引き続き {@link android.app.Activity#onStart()} と {@link android.app.Activity#onResume()} メソッドを呼び出します。 222 223アクティビティは、作成や開始の状態で留まることはありません。技術的には、アクティビティは {@link android.app.Activity#onStart()} が呼び出されたときにユーザーに表示されますが、すぐに 224{@link android.app.Activity#onResume()} が続き、電話の着信やユーザーが別のアクティビティに移動したり、端末の画面がオフになったりした際のように、状態を変える状況が発生するまで、アクティビティは再開状態のままとなります。 225 226 227</p> 228 229<p>この後に続く他のレッスンでは、その他の起動メソッドである {@link 230android.app.Activity#onStart()} と {@link android.app.Activity#onResume()} が一時停止状態または停止状態からアクティビティを再開するために使用された場合、これらのメソッドがアクティビティのライフサイクル中にいかに有用であるかを説明します。 231</p> 232 233<p class="note"><strong>注:</strong> {@link android.app.Activity#onCreate onCreate()}メソッドには、<a href="recreating.html">アクティビティの再作成</a>についての後続のレッスンで説明している <code>savedInstanceState</code> と呼ぶパラメータが含まれています。 234 235</p> 236 237 238<img src="{@docRoot}images/training/basics/basic-lifecycle-create.png" /> 239<p class="img-caption"><strong>図 2.</strong> アクティビティの新しいインスタンスを作成する際に 240システムが順に呼び出す 3 つの主なコールバックである 241{@link android.app.Activity#onCreate onCreate()}、{@link 242android.app.Activity#onStart()}、{@link android.app.Activity#onResume()} を強調した、アクティビティのライフサイクル構造の別の図です。コールバックのこのシーケンスが完了すると、アクティビティは再開状態に達し、ユーザーは別のアクティビティに切り替えるまではこのアクティビティを操作できます。 243 244</p> 245 246 247 248 249 250 251 252<h2 id="Destroy">アクティビティを破棄する</h2> 253 254<p>アクティビティの最初のライフサイクル コールバックは、{@link android.app.Activity#onCreate 255onCreate()} であり、最終のコールバックは {@link android.app.Activity#onDestroy} です。システムは、アクティビティのインスタンスが完全にシステム メモリから削除される最終的な指示として、アクティビティでこのメソッドを呼び出します。 256 257</p> 258 259<p>ほとんどのアプリでは、このメソッドを実装する必要はありません。なぜなら、ローカルのクラス参照はアクティビティを使用して破棄され、自分のアクティビティでは、{@link 260android.app.Activity#onPause} と {@link android.app.Activity#onStop} の間にほぼすべてのクリーンアップを実行する必要があるからです。 261ただし、アクティビティに、{@link 262android.app.Activity#onCreate onCreate()} の間、または他の長時間実行中のリソースで作成された、正常に閉じないとメモリのリークを引き起こす可能性のあるバックグラウンド スレッドが含まれている場合、{@link 263android.app.Activity#onDestroy} の間にそれらを破棄する必要があります。 264 265</p> 266 267<pre> 268@Override 269public void onDestroy() { 270 super.onDestroy(); // Always call the superclass 271 272 // Stop method tracing that the activity started during onCreate() 273 android.os.Debug.stopMethodTracing(); 274} 275</pre> 276 277<p class="note"><strong>注:</strong> ある状況を除くすべての状況では、システムは{@link android.app.Activity#onPause} と {@link 278android.app.Activity#onStop} を呼び出した後に {@link android.app.Activity#onDestroy}を呼び出します。ある状況とは、{@link android.app.Activity#onCreate onCreate()}メソッド内から {@link 279android.app.Activity#finish()} を呼び出したときです。 280 281自分のアクティビティが別のアクティビティを起動するための一時的な意思決定機能として動作する場合のようないくつかのケースでは、{@link 282android.app.Activity#onCreate onCreate()} 内から {@link android.app.Activity#finish()} を呼び出してアクティビティを破棄できます。 283この場合、システムは他のライフサイクルの任意のメソッドを呼び出すことなく、すぐに {@link android.app.Activity#onDestroy} を呼び出します。 284 285</p> 286