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&lt;intent-filter&gt;}</a> を使用してマニフェストで宣言する必要があります。
154次に例を示します。</p>
155
156<pre>
157&lt;activity android:name=".MainActivity" android:label="&#64;string/app_name">
158    &lt;intent-filter>
159        &lt;action android:name="android.intent.action.MAIN" />
160        &lt;category android:name="android.intent.category.LAUNCHER" />
161    &lt;/intent-filter>
162&lt;/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&#64;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&#64;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