• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=タスクとバックスタック
2parent.title=アクティビティ
3parent.link=activities.html
4@jd:body
5
6<div id="qv-wrapper">
7<div id="qv">
8
9<h2>本書の内容</h2>
10<ol>
11<li><a href="#ActivityState">アクティビティの状態を保存する</a></li></li>
12<li><a href="#ManagingTasks">タスクを管理する</a>
13  <ol>
14    <li><a href="#TaskLaunchModes">起動モードを定義する</a></li>
15    <li><a href="#Affinities">アフィニティを処理する</a></li>
16    <li><a href="#Clearing">バックスタックをクリアする</a></li>
17    <li><a href="#Starting">タスクを開始する</a></li>
18  </ol>
19</li>
20</ol>
21
22<h2>記事</h2>
23<ol>
24  <li><a href="http://android-developers.blogspot.com/2010/04/multitasking-android-way.html">Multitasking the Android Way</a>
25</li>
26</ol>
27
28<h2>関連ドキュメント</h2>
29<ol>
30  <li><a href="{@docRoot}design/patterns/navigation.html">Android Design: Navigation</a>
31</li>
32  <li><a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;} manifest element</a>
33</li>
34  <li><a href="{@docRoot}guide/components/recents.html">オーバービュー画面</a></li>
35</ol>
36</div>
37</div>
38
39
40<p>通常、アプリケーションには複数の<a href="{@docRoot}guide/components/activities.html">アクティビティ</a>が含まれています。それぞれのアクティビティは、ユーザーが実行して、他のアクティビティを開始するといった特定のアクションを中心に設計されています。
41
42たとえば、メール アプリケーションに新規メッセージ一覧を表示する 1 つのアクティビティがあるとします。ユーザーがメッセージを選択すると、そのメッセージを表示するための新しいアクティビティが開きます。
43</p>
44
45<p>アクティビティでは、端末上の他のアプリケーションに存在するアクティビティを開始することもできます。たとえば、アプリケーションがメールの送信を求める場合は、「送信」アクションを実行し、メールアドレスや本文などのデータを含めるインテントを定義できます。
46
47その結果、この種のインテントの処理を宣言している別のアプリケーションのアクティビティが開きます。
48この場合、インテントはメールを送信することであるため、メール アプリケーションの「作成」アクティビティが開始されます(複数のアクティビティが同じインテントに対応している場合、システムはユーザーに選択を求めます)。
49
50メールが送信されると、元のアクティビティが再開され、まるでメール アクティビティがそのアプリケーションの一部であるように見えます。
51アクティビティは異なるアプリケーションのものでも、Android は両方のアクティビティを同じ<em>タスク</em>内に保つことによって、このシームレスな操作性を維持しています。
52
53</p>
54
55<p>タスクとは、ユーザーが特定の作業を行う時に情報のやり取りを行うアクティビティの集まりです。
56アクティビティは、各アクティビティが開かれた順にスタック(<em>バックスタック</em>)形式で配置されます。
57</p>
58
59<!-- SAVE FOR WHEN THE FRAGMENT DOC IS ADDED
60<div class="sidebox-wrapper">
61<div class="sidebox">
62<h3>Adding fragments to a task's back stack</h3>
63
64<p>Your activity can also include {@link android.app.Fragment}s to the back stack. For example,
65suppose you have a two-pane layout using fragments, one of which is a list view (fragment A) and the
66other being a layout to display an item from the list (fragment B). When the user selects an item
67from the list, fragment B is replaced by a new fragment (fragment C). In this case, it might be
68desireable for the user to navigate back to reveal fragment B, using the <em>Back</em> button.</p>
69<p>In order to add fragment B to the back stack so that this is possible, you must call {@link
70android.app.FragmentTransaction#addToBackStack addToBackStack()} before you {@link
71android.app.FragmentTransaction#commit()} the transaction that replaces fragment B with fragment
72C.</p>
73<p>For more information about using fragments and adding them to the back stack, see the {@link
74android.app.Fragment} class documentation.</p>
75
76</div>
77</div>
78-->
79
80<p>ほとんどのタスクは、端末のホーム画面から開始されます。ユーザーがアプリケーション ランチャーでアイコン(またはホーム画面のショートカット)にタッチすると、アプリケーションのタスクがフォアグラウンドに移動します。
81
82アプリケーションにタスクが存在しない(アプリケーションが最近使われていない)場合は、新しいタスクが作成され、そのアプリケーションの「メイン」アクティビティがスタック内のルート アクティビティとして開きます。
83
84</p>
85
86<p>現在のアクティビティが別のアクティビティを開始すると、新しいアクティビティがスタックの一番上にプッシュされ、アクティブになります。
87前のアクティビティはスタックに残りますが、停止されます。アクティビティが停止すると、システムはそのユーザー インターフェースの状態を維持します。
88ユーザーが [<em>戻る</em>] ボタンを押すと、現在のアクティビティがスタックの一番上から消え(アクティビティは破棄され)、前のアクティビティが再開します(UI は前の状態で復元されます)。
89
90
91スタック内のアクティビティが並べ替えられることはなく、スタック上にプッシュされるかスタックから消されるかのみです &mdash; 現在のアクティビティにより開始されるとスタック上にプッシュされ、ユーザーが [<em>戻る</em>] ボタンを押すと破棄されます。
92
93このように、バックスタックは「後入れ先出し」オブジェクト構造となっています。
94
95図 1 は、この動作を時系列に視覚化し、アクティビティとそれに伴うその時点でのバックスタックの状態を示したものです。
96
97</p>
98
99<img src="{@docRoot}images/fundamentals/diagram_backstack.png" alt="" />
100<p class="img-caption"><strong>図 1.</strong>タスク内の新しいアクティビティがバックスタックにアイテムを追加するプロセスを示しています。
101ユーザーが [<em>戻る</em>] ボタンを押すと、現在のアクティビティは破棄され、前のアクティビティが再開します。
102
103</p>
104
105
106<p>ユーザーが続けて [<em>戻る</em>] ボタンを押すと、スタック内のアクティビティは消えていき、前のアクティビティが表示されます。最終的に、ユーザーはホーム画面(またはタスクの開始時に実行されていたアクティビティ)に戻ります。
107
108
109すべてのアクティビティがスタックから削除されると、タスクはなくなります。</p>
110
111<div class="figure" style="width:287px">
112<img src="{@docRoot}images/fundamentals/diagram_multitasking.png" alt="" /> <p
113class="img-caption"><strong>図 2.</strong> 2 つのタスク: タスク B がフォアグラウンドでユーザー操作を受け入れます。タスク A は再開されるまでバックグラウンドで待機します。
114</p>
115</div>
116<div class="figure" style="width:215px">
117  <img src="{@docRoot}images/fundamentals/diagram_multiple_instances.png" alt="" /> <p
118class="img-caption"><strong>図 3.</strong> 1 つのアクティビティが複数回インスタンス化されます。</p>
119</div>
120
121<p>タスクは結束した構成単位で、ユーザーが新しいタスクを開始したり [<em>ホーム</em>] ボタンを使ってホーム画面に移動したりすると「バックグラウンド」に移動できます。
122バックグラウンドでは、タスク内のすべてのアクティビティが停止されますが、タスクのバックスタックは元の状態を保ちます &mdash; 図 2 に示すように、別のタスクが行われている間、タスクはフォーカスを失った状態になります。
123
124
125タスクはその後「フォアグラウンド」に戻り、ユーザーは操作の続きを行うことができます。
126たとえば、現在のタスク(タスク A)のスタックに 3 つのアクティビティがあるとします。現在のアクティビティの下に 2 つのアクティビティがある状態です。
127ユーザーが [<em>ホーム</em>] ボタンを押し、アプリケーション ランチャーから新しいアプリケーションを起動します。
128
129ホーム画面が表示されると、タスク A はバックグラウンドに移動します。
130新しいアプリケーションが起動すると、システムはそのアプリケーションのタスク(タスク B)を開始します。タスク B には独自のアクティビティ スタックがあります。
131アプリケーションの操作が終了すると、ユーザーはホームに戻り、タスク A を開始した元のアプリケーションを選択します。ここでタスク A はフォアグラウンドに移動します &mdash; 3 つのアクティビティはすべて元のままで、スタックの一番上にあるアクティビティが再開します。
132
133
134
135この時点で、ユーザーはホームに移動してタスク B を開始したアプリケーションを選択して(または<a href="{@docRoot}guide/components/recents.html">オーバービュー画面</a>でアプリのタスクを選択して)タスク B に切り替えることもできます。これは、Android のマルチタスク操作の一例です。
136
137
138
139</p>
140
141<p class="note"><strong>注:</strong> バックグラウンドには複数のタスクを一度に置くことができます。しかし、ユーザーが多数のバックグラウンド タスクを同時に実行すると、システムがメモリを回復するためにバックグラウンド アクティビティを破棄する場合があります。その結果、アクティビティの状態は失われます。<a href="#ActivityState">アクティビティの状態</a>セクションをご覧ください。
142
143
144</p>
145
146<p>バックスタック内のアクティビティが並べ替えられることはないため、アプリケーションが複数のアクティビティからの特定のアクティビティ開始を許可すると、(アクティビティの前のインスタンスを一番上に移動させるのではなく)そのアクティビティの新しいインスタンスが作成されてスタック上にプッシュされます。
147
148
149これによって、図 3 に示すように、アプリケーションの 1 つのアクティビティが(別のタスクからも)複数回インスタンス化される場合があります。
150この場合は、ユーザーが [<em>戻る</em>] ボタンを使って移動すると、アクティビティの各インスタンスが(UI の状態はそれぞれそのままで)開いた順に表示されます。
151
152
153しかし、1 つのアクティビティを何度もインスタンス化したくない場合は、この動作を修正できます。
154その方法については、後述のセクション<a href="#ManagingTasks">タスクを管理する</a>で説明します。</p>
155
156
157<p>以下は、アクティビティとタスクのデフォルトの動作をまとめたものです。</p>
158
159<ul>
160  <li>アクティビティ A がアクティビティ B を開始すると、アクティビティ A は停止しますが、システムはその状態(スクロールの位置やフォームに入力されたテキストなど)を保持します。アクティビティ B が開いた状態でユーザーが [<em>戻る</em>] ボタンを押すと、アクティビティ A が再開し、その状態が復元されます。
161
162
163</li>
164  <li>ユーザーが [<em>ホーム</em>] ボタンを押してタスクを離れると、現在のアクティビティは停止し、そのタスクはバックグラウンドに移動します。
165
166システムはタスク内のすべてのアクティビティの状態を保持します。後にユーザーがタスクを開始したランチャー アイコンを選択してタスクを再開すると、タスクはフォアグラウンドに移動し、スタックの一番上にあるアクティビティを開始します。
167
168</li>
169  <li>ユーザーが [<em>戻る</em>] ボタンを押すと、現在のアクティビティはスタックから消え、破棄されます。
170
171スタック内にある前のアクティビティが再開します。アクティビティが破棄された場合、システムはその状態を<em>保持しません</em>。
172</li>
173  <li>アクティビティは、別のタスクからでも複数回インスタンス化できます。</li>
174</ul>
175
176
177<div class="note design">
178<p><strong>ナビゲーション デザイン</strong></p>
179  <p>Android 上でのアプリ ナビゲーションの仕組みの詳細については、Android Design の「<a href="{@docRoot}design/patterns/navigation.html">Navigation</a>」ガイドをご覧ください。</p>
180</div>
181
182
183<h2 id="ActivityState">アクティビティの状態を保存する</h2>
184
185<p>上述のように、デフォルト動作では、システムはアクティビティが停止するとその状態を保持します。
186この方法では、ユーザーが前のアクティビティに戻ると、ユーザー インターフェースが前の状態のままで表示されます。
187しかし、コールバック メソッドを使って積極的にアクティビティの状態を保持することもできます。破棄されたアクティビティを再作成しなければならないことを考えると、アクティビティの状態は積極的に<strong>保持すべき</strong>です。
188
189</p>
190
191<p>システムが(新しいアクティビティの開始時やバックグラウンドへのタスクの移動時などに)アクティビティの 1 つを停止している時にシステム メモリの回復が必要になると、システムはそのアクティビティを完全に破棄する可能性があります。
192
193これにより、アクティビティの状態に関する情報が失われてしまいます。システムは、アクティビティがバックスタックに留まっていることは認識していますが、アクティビティがスタックの一番上に置かれるとアクティビティを(再開ではなく)再作成しなければなりません。
194
195
196ユーザーの作業内容が失われるのを回避するには、{@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} コールバック メソッドをアクティビティに実装することによって、作業状態を積極的に保持する必要があります。
197
198
199</p>
200
201<p>アクティビティの状態の保存方法の詳細については、「<a href="{@docRoot}guide/components/activities.html#SavingActivityState">Activities</a>」ドキュメントをご覧ください。
202</p>
203
204
205
206<h2 id="ManagingTasks">タスクを管理する</h2>
207
208<p>上記のように、Android は、連続して開始されたすべてのアクティビティを同じタスクの「後入れ先出し」式スタックに置くことによって、タスクやバックスタックを管理します。この方法は、ほとんどのアプリケーションでうまく動作し、アクティビティがどのようにタスクに関連付けられ、どのようにバックスタックに置かれているのかを心配する必要はありません。
209
210
211しかし、通常の動作に割り込みたい場合もあります。
212アプリケーション内のアクティビティが開始された時に(現在のタスク内に置かれる代わりに)新しいタスクを開始させたり、アクティビティの開始時に(新しいインスタンスをバックスタックの一番上に作成する代わりに)アクティビティの既存インスタンスを前に持ってきたり、ユーザーがタスクを離れる時にルート アクティビティ以外のすべてのアクティビティをバックスタックからクリアする場合などが考えられます。
213
214
215
216</p>
217
218<p><a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a> マニフェスト エレメントの属性と {@link android.app.Activity#startActivity startActivity()} に渡すインテント内のフラグを使って、これらの、さらに他の動作を実現できます。
219
220
221</p>
222
223<p>この件に関して、使用できる主な <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a> 属性には以下のものがあります。
224</p>
225
226<ul class="nolist">
227  <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#aff">  {@code taskAffinity}</a>
228</li>
229  <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">  {@code launchMode}</a>
230</li>
231  <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#reparent">  {@code allowTaskReparenting}</a>
232</li>
233  <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#clear">  {@code clearTaskOnLaunch}</a>
234</li>
235  <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#always">  {@code alwaysRetainTaskState}</a>
236</li>
237  <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#finish">  {@code finishOnTaskLaunch}</a>
238</li>
239</ul>
240
241<p>使用できる主なインテント フラグには以下のものがあります。</p>
242
243<ul class="nolist">
244  <li>{@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK}</li>
245  <li>{@link android.content.Intent#FLAG_ACTIVITY_CLEAR_TOP}</li>
246  <li>{@link android.content.Intent#FLAG_ACTIVITY_SINGLE_TOP}</li>
247</ul>
248
249<p>以下のセクションでは、これらのマニフェスト属性とインテント フラグを使ってアクティビティをタスクに関連付ける方法とバックスタック内での動作を定義する方法を説明します。
250</p>
251
252<p>また、タスクとアクティビティの提示方法やオーバービュー画面での管理方法に関する考慮点について別途記載しています。
253詳細については、「<a href="{@docRoot}guide/components/recents.html">オーバービュー画面</a>」をご覧ください。
254通常、オーバービュー画面にタスクとアクティビティを提示する方法はシステムが定義できるよう許可し、この動作を変更する必要はありません。
255</p>
256
257<p class="caution"><strong>警告:</strong> ほとんどのアプリケーションはアクティビティとタスクに対するデフォルトの動作に割り込むべきではありません。
258アクティビティがデフォルトの動作を変更する必要があると判断した場合は、起動時と他のアクティビティやタスクからの [<em>戻る</em>] ボタンによる移動時のアクティビティのユーザビリティを慎重にテストする必要があります。ユーザーが想定する動作と競合する恐れのあるナビゲーション時の動作については必ずテストを行ってください。
259
260
261</p>
262
263
264<h3 id="TaskLaunchModes">起動モードを定義する</h3>
265
266<p>起動モードでは、アクティビティの新しいインスタンスを現在のタスクに関連付ける方法を定義できます。
267次の 2 つの方法を使ってさまざまな起動モードを定義できます。</p>
268<ul class="nolist">
269  <li><a href="#ManifestForTasks">マニフェスト ファイルを使用する</a>
270    <p>マニフェスト ファイルにアクティビティを宣言する際に、開始時にアクティビティをタスクに関連付ける方法を指定できます。
271</li>
272  <li><a href="#IntentFlagsForTasks">インテント フラグを使用する</a>
273    <p>{@link android.app.Activity#startActivity startActivity()} を呼び出す際に、新しいアクティビティを現在のタスクに関連付ける方法(または関連付けるかどうか)を宣言する {@link android.content.Intent} にフラグを置くことができます。
274
275</p></li>
276</ul>
277
278<p>アクティビティ A がアクティビティ B を開始する場合、アクティビティ B は自身を現在のタスクに関連付ける方法(もしあれば)をマニフェストに定義し、アクティビティ A はアクティビティ B を現在のタスクに関連付ける方法を要求できます。
279
280両方のアクティビティがアクティビティ B をタスクに関連付ける方法を定義している場合は、アクティビティ B の要求よりも(インテントに定義される)アクティビティ A の要求が優先されます。
281
282</p>
283
284<p class="note"><strong>注:</strong> マニフェスト ファイルで使用できる起動モードの中にはインテントのフラグとして使用できないものもあります。同様に、インテントのフラグとして使用できる起動モードの中には、マニフェストで定義できないものもあります。
285
286</p>
287
288
289<h4 id="ManifestForTasks">マニフェスト ファイルを使用する</h4>
290
291<p>マニフェスト ファイルでアクティビティを宣言する際に、<a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a> エレメントの <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code launchMode}</a> 属性を使ってアクティビティをタスクに関連付ける方法を定義できます。
292
293
294</p>
295
296<p><a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code launchMode}</a> 属性は、アクティビティをタスク内で起動する方法についての指示を定めます。
297
298<code><a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">launchMode</a></code> 属性には、次の 4 つの起動モードを割り当てることができます。
299
300</p>
301
302<dl>
303<dt>{@code "standard"}(デフォルトのモード)</dt>
304  <dd>デフォルトの設定です。システムは、開始されたタスクからアクティビティの新しいインスタンスをタスク内に作成し、インテントを渡します。
305アクティビティは複数回インスタンス化できます。各インスタンスは異なるタスクに所属でき、1 つのタスクは複数のインスタンスを持つことができます。
306</dd>
307<dt>{@code "singleTop"}</dt>
308  <dd>アクティビティのインスタンスが現在のタスクの一番上に既に存在する場合は、システムはアクティビティの新しいインスタンスを作成せずに、{@link android.app.Activity#onNewIntent onNewIntent()} メソッドを呼び出して、インテントをそのインスタンスに渡します。
309
310
311アクティビティは複数回インスタンス化できます。各インスタンスは異なるタスクに所属でき、1 つのタスクは複数のインスタンスを持つことができます(バックスタックの一番上にあるアクティビティがそのアクティビティの既存のインスタンスで<em>ない</em>場合のみ)。
312
313
314  <p>たとえば、タスクのバックスタックがアクティビティ B、C、そしてアクティビティ D を一番上に持つルート アクティビティ A で構成されているとします(スタックは A-B-C-D で D が一番上)。
315D タイプのアクティビティにインテントが届きます。もし D の起動モードがデフォルトの {@code "standard"} である場合は、そのクラスの新しいインスタンスが起動し、スタックは A-B-C-D-D となります。しかし、D の起動モードが {@code "singleTop"} である場合は、スタックの一番上にある D の既存のインスタンスが {@link android.app.Activity#onNewIntent onNewIntent()} を介してインテントを受け取ります &mdash; この場合、スタックは A-B-C-D のままとなります。ただし、B タイプのアクティビティのインテントが届くと、その起動モードが {@code "singleTop"} であっても、B の新しいインスタンスがスタックに追加されます。
316
317
318
319
320
321</p>
322  <p class="note"><strong>注:</strong> アクティビティの新しいインスタンスが作成されると、ユーザーは [<em>戻る</em>] ボタンを押して前のアクティビティに戻ることができます。
323しかし、アクティビティの既存のインスタンスが新しいインテントに対応すると、ユーザーは、新しいインテントが {@link android.app.Activity#onNewIntent onNewIntent()} で届く前の状態に [<em>戻る</em>] ボタンを押して戻ることはできません。
324
325
326
327
328</p>
329</dd>
330
331<dt>{@code "singleTask"}</dt>
332  <dd>システムは新しいタスクを作成し、新しいタスクのルートにアクティビティをインスタンス化します。しかし、そのアクティビティのインスタンスが別のタスクに既に存在する場合は、システムは新しいインスタンスを作成せずに、{@link android.app.Activity#onNewIntent onNewIntent()} メソッドを呼び出して、インテントを既存のインスタンスに渡します。
333
334
335同時に存在できるアクティビティのインスタンスは 1 つだけです。
336
337  <p class="note"><strong>注:</strong> アクティビティは新しいタスク内で開始されますが、ユーザーは [<em>戻る</em>] ボタンを押して前のアクティビティに戻ることができます。
338</p></dd>
339<dt>{@code "singleInstance"}</dt>
340  <dd>システムが、他のアクティビティをインスタンスを保持しているタスクで起動しないことを除いて {@code "singleTask"} と同じです。
341アクティビティは、常にタスクの唯一の構成要素となります。このアクティビティによって開始されたアクティビティは別のタスクで開きます。
342</dd>
343</dl>
344
345
346<p>たとえば、Android Browser アプリケーションは、<a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a> エレメントの {@code singleTask} 起動モードを指定することによって、ウェブブラウザ アクティビティを常に自身のタスクで開くことを宣言しています。これは、開発されたアプリケーションが Android Browser を開くインテントを発行すると、そのアクティビティがアプリケーションのタスクには配置<em>されない</em>ことを意味します。
347
348
349
350代わりに、Android Browser の新しいタスクが開始されるか、Android Browser に既に実行中のバックグラウンド タスクがある場合は、そのタスクがフォアグラウンドに移動し、新しいインテントに対応します。
351
352</p>
353
354<p>アクティビティを新しいタスク内で開始するかアクティビティを起動したアクティビティと同じタスクで開始するかにかかわらず、ユーザーは [<em>戻る</em>] ボタンを押して前のアクティビティに戻ることができます。
355ただし、{@code singleTask} 起動モードを設定したアクティビティを開始し、そのアクティビティのインスタンスがバックグラウンド タスクに存在する場合は、そのタスク全体がフォアグラウンドに移動します。
356
357この時点で、バックスタックの一番上に、フォアグラウンドに移動したタスクのすべてのアクティビティが含まれてます。
358
359図 4 は、このタイプのシナリオを示しています。</p>
360
361<img src="{@docRoot}images/fundamentals/diagram_backstack_singletask_multiactivity.png" alt="" />
362<p class="img-caption"><strong>図 4.</strong>「singleTask」起動モードを持つアクティビティをバックスタックに追加する方法を示しています。
363アクティビティが自身のバックスタックを持つバックグラウンド タスクの一部である場合は、バックスタック全体がフォアグラウンドに移動し、現在のタスクの上に置かれます。
364
365</p>
366
367<p>マニフェスト ファイルでの起動モードの使用の詳細については、<code><a href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code> エレメントのドキュメントをご覧ください。{@code launchMode} 属性と利用できる値について詳しく説明しています。
368
369
370</p>
371
372<p class="note"><strong>注:</strong> 次のセクションで説明しますが、<a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code launchMode}</a> 属性を使ってアクティビティに指定する動作は、アクティビティを開始するインテントに含まれるフラグによって上書きされる場合があります。
373
374</p>
375
376
377
378<h4 id="#IntentFlagsForTasks">インテント フラグを使用する</h4>
379
380<p>アクティビティの開始時に、{@link android.app.Activity#startActivity startActivity()} に渡すインテントにフラグを含めることによってアクティビティとタスクのデフォルトの関連付けを変更できます。
381
382以下は、デフォルトの動作を変更するために使用できるフラグです。
383</p>
384
385<p>
386  <dt>{@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK}</dt>
387    <dd>新しいタスクでアクティビティを開始します。開始しようとしているアクティビティに対してタスクが既に実行されている場合は、そのタスクの最新の状態が復元されてフォアグラウンドに移動し、アクティビティが {@link android.app.Activity#onNewIntent onNewIntent()} で新しいインテントを受け取ります。
388
389
390    <p>この手順は、上述のセクションで説明した {@code "singleTask"} <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code launchMode}</a> の値の動作と同じものです。
391</p></dd>
392  <dt>{@link android.content.Intent#FLAG_ACTIVITY_SINGLE_TOP}</dt>
393    <dd>開始されるアクティビティが(バックスタックの一番上にある)現在のアクティビティである場合は、アクティビティの新しいインスタンスを作成する代わりに、既存のインスタンスが {@link android.app.Activity#onNewIntent onNewIntent()} の呼び出しを受け取ります。
394
395
396    <p>この手順は、上述のセクションで説明した {@code "singleTop"} <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code launchMode}</a> の値の動作と同じものです。
397</p></dd>
398  <dt>{@link android.content.Intent#FLAG_ACTIVITY_CLEAR_TOP}</dt>
399    <dd>開始されるアクティビティが既に現在のタスクを実行している場合は、そのアクティビティの新しいインスタンスを起動する代わりに、上に置かれたその他すべてのアクティビティを破棄し、{@link android.app.Activity#onNewIntent onNewIntent()} を介してこのインテントを(一番上に移動した)アクティビティの再開されたインスタンスに渡します。
400
401
402
403    <p>この動作を起こす <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code launchMode}</a> 属性には値はありません。
404</p>
405    <p>ほとんどのケースで {@code FLAG_ACTIVITY_CLEAR_TOP} は {@code FLAG_ACTIVITY_NEW_TASK} と併用されます。同時に使用することで、これらのフラグは、別のタスクにある既存のアクティビティを捜し出し、インテントに対応できる位置に置く手段を提供します。
406
407
408 </p>
409    <p class="note"><strong>注:</strong> 指定されたアクティビティの起動モードが {@code "standard"} である場合は、やはりスタックから削除されます。その場所に、渡されるインテントに対応する新しいインスタンスが開始されます。
410
411
412これは、起動モードが {@code "standard"} である場合は、新しいインテントに対して常に新しいインスタンスが作成されるためです。
413 </p>
414</dd>
415</dl>
416
417
418
419
420
421<h3 id="Affinities">アフィニティを処理する</h3>
422
423<p><em>アフィニティ</em>は、アクティビティの所属が望ましいタスクを示します。 デフォルトでは、同じアプリケーションのすべてアクティビティに相互のアフィニティが設定されています。
424このため、同じアプリケーションのすべてのアクティビティは、デフォルトで同じタスクに属します。
425しかし、アクティビティのデフォルトのアフィニティは変更できます。
426異なるアプリケーションに定義されているアクティビティがアフィニティを共有したり、同じアプリケーションに定義されたアクティビティに別のタスクのアフィニティを割り当てたりすることができます。
427
428</p>
429
430<p><a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a> エレメントの <a href="{@docRoot}guide/topics/manifest/activity-element.html#aff">{@code taskAffinity}</a> 属性を使って、任意のアクティビティのアフィニティを変更できます。
431
432</p>
433
434<p><a href="{@docRoot}guide/topics/manifest/activity-element.html#aff">{@code taskAffinity}</a> 属性には文字列を指定します。これは、<a href="{@docRoot}guide/topics/manifest/manifest-element.html">{@code &lt;manifest&gt;}</a> エレメントに宣言されたデフォルトのパッケージ名とは異なる一意のものでなければなりません。理由は、システムがアプリケーションに対するデフォルトのタスク アフィニティを識別するためにこの名前を使用するためです。
435
436
437
438
439</p>
440
441<p>アフィニティは、以下の 2 つの状況で役立ちます。</p>
442<ul>
443  <li>アクティビティを開始するインテントが {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK} フラグを含んでいる場合
444
445
446
447<p>新しいアクティビティは、デフォルトで、{@link android.app.Activity#startActivity startActivity()} を呼び出したアクティビティのタスクで開始されます。
448呼び出し元と同じバックスタックにプッシュされます。
449しかし、{@link android.app.Activity#startActivity startActivity()} に渡されたインテントに {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK} フラグが含まれると、システムは新しいアクティビティを収容する別のタスクを捜します。
450
451
452これは、通常新しいタスクですが、新しいタスクである必要はありません。
453新しいアクティビティとして同じアフィニティを持つ既存のタスクが存在する場合は、アクティビティはそのタスクで開始されます。
454存在しない場合は、新しいタスクを開始します。</p>
455
456<p>このフラグによってアクティビティが新しいタスクを開始し、ユーザーが [<em>ホーム</em>] ボタンを押してタスクを離れる場合には、ユーザーがそのタスクに戻るための手段が必要です。
457
458エンティティの中には(通知マネージャーなど)、自身の一部としてではなく、常に外部タスクでアクティビティを開始するものがあります。そのために、これらのエンティティが {@link android.app.Activity#startActivity startActivity()} に渡すインテントには常に {@code FLAG_ACTIVITY_NEW_TASK} が含まれます。このフラグを使った外部エンティティにより起動される可能性があるアクティビティがある場合は、起動アイコンなどを使って、アクティビティが開始したタスクにユーザーが戻れるよう独立した手段を確保します。(タスクのルート アクティビティには {@link android.content.Intent#CATEGORY_LAUNCHER} インテント フィルタがあります。後述の<a href="#Starting">タスクを開始する</a>セクションをご覧ください)。
459
460
461
462
463
464
465</p>
466</li>
467
468  <li>アクティビティの <a href="{@docRoot}guide/topics/manifest/activity-element.html#reparent">{@code allowTaskReparenting}</a> 属性が {@code "true"} に設定されている場合。
469
470  <p>この場合は、タスクがフォアグラウンドに移動した時に、アクティビティは自身が開始したタスクから、アフィニティがあるタスクへと移動できます。
471</p>
472  <p>たとえば、選ばれた都市の天気を予報するアクティビティが旅行アプリケーションの一部として定義されているケースを考えてみましょう。
473このアクティビティは、アプリケーション内のその他のアクティビティと同じアフィニティ(デフォルトのアプリケーション アフィニティ)を持ち、この属性による親への再割り当てが許可されています。いずれかのアクティビティにより開始された天気予報アクティビティは、最初はそのアクティビティと同じタスクに属しています。
474
475
476しかし、旅行アプリケーションのタスクがフォアグラウンドに移動すると、天気予報アクティビティはそのタスクに再度割り当てられ、タスク内に表示されます。
477</p>
478</li>
479</ul>
480
481<p class="note"><strong>ヒント:</strong> {@code .apk} ファイルがユーザーの視点で 1 つ以上の「アプリケーション」を含んでいる場合は、各「アプリケーション」に関連付けられたアクティビティに <a href="{@docRoot}guide/topics/manifest/activity-element.html#aff">{@code taskAffinity}</a> 属性を使って異なるアフィニティを割り当てることをお勧めします。
482
483</p>
484
485
486
487<h3 id="Clearing">バックスタックをクリアする</h3>
488
489<p>ユーザーがタスクを長時間離れると、システムはルート アクティビティを除くすべてのアクティビティをタスクからクリアします。
490ユーザーが再びタスクに戻ると、ルート アクティビティのみが復元されます。システムがこの動作を行うのは、しばらく時間が経過した後は、ユーザーが前に行っていた作業を放棄した可能性が高く、新しいことを始めるためにタスクに戻ったとみなされるためです。
491
492 </p>
493
494<p>この動作を変更するために、以下のアクティビティ属性を使用できます。 </p>
495
496<dl>
497<dt><code><a
498href="{@docRoot}guide/topics/manifest/activity-element.html#always">alwaysRetainTaskState</a></code>
499</dt>
500<dd>タスクのルート アクティビティでこの属性が {@code "true"} に設定されていると、上記のデフォルトの動作は発生しません。長時間が経過しても、タスクはすべてのアクティビティをスタックに保持します。
501
502</dd>
503
504<dt><code><a
505href="{@docRoot}guide/topics/manifest/activity-element.html#clear">clearTaskOnLaunch</a></code></dt>
506<dd>タスクのルート アクティビティでこの属性が {@code "true"} に設定されている場合、ユーザーがタスクを離れて戻るたびに、スタックがルート アクティビティまでクリアされます。
507
508つまり、<a href="{@docRoot}guide/topics/manifest/activity-element.html#always">{@code alwaysRetainTaskState}</a> の逆の動作となります。
509
510ユーザーがタスクをほんの少しの間離れた場合でも、タスクは常に初期状態に戻ります。
511</dd>
512
513<dt><code><a
514href="{@docRoot}guide/topics/manifest/activity-element.html#finish">finishOnTaskLaunch</a></code>
515</dt>
516<dd>この属性は、<a href="{@docRoot}guide/topics/manifest/activity-element.html#clear">{@code clearTaskOnLaunch}</a> に似ていますが、タスク全体ではなく 1 つのアクティビティに作用します。
517
518ルート アクティビティを含むあらゆるアクティビティを消すことができます。
519この属性が {@code "true"} に設定されていると、アクティビティは現在のセッションが開かれている間のみタスクの一部として留まります。
520ユーザーがタスクから離れて戻ると、アクティビティは消えています。
521</dd>
522</dl>
523
524
525
526
527<h3 id="Starting">タスクを開始する</h3>
528
529<p>指定するアクションとして {@code "android.intent.action.MAIN"}、指定するカテゴリとして {@code "android.intent.category.LAUNCHER"} を持つインテント フィルタを付加することによって、アクティビティをタスクのエントリ ポイントとして設定できます。
530
531
532次に例を示します。</p>
533
534<pre>
535&lt;activity ... &gt;
536    &lt;intent-filter ... &gt;
537        &lt;action android:name="android.intent.action.MAIN" /&gt;
538        &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
539    &lt;/intent-filter&gt;
540    ...
541&lt;/activity&gt;
542</pre>
543
544<p>この種類のインテント フィルタを使うことによって、アクティビティのアイコンとラベルがアプリケーション ランチャーに表示されるようになります。これにより、ユーザーは、アクティビティを起動し、アクティビティの起動後は、作成されたタスクにいつでも戻ることができるようになります。
545
546
547</p>
548
549<p>ユーザーがタスクを離れた後に、このアクティビティ ランチャーを使って戻ってくることが可能でなければならないため、2 番目の機能が重要になります。
550アクティビティが {@link android.content.Intent#ACTION_MAIN} と {@link android.content.Intent#CATEGORY_LAUNCHER} フィルタを持つ場合のみに、アクティビティが常にタスクを開始することを示す {@code "singleTask"} と {@code "singleInstance"} の 2 つの<a href="#LaunchModes">起動モード</a>を使用すべきなのはこのためです。
551
552
553
554たとえば、フィルタがない場合にどうなるのかを想像してみてください。
555インテントが {@code "singleTask"} アクティビティを起動し、新しいタスクを開始し、ユーザーがそのタスクでしばらくの間作業を行います。
556その後、ユーザーは [<em>ホーム</em>] ボタンを押します。
557タスクはバックグラウンドに移動し、見えなくなります。タスクはアプリケーション ランチャーに表示されていないため、この状態ではユーザーがタスクに戻る手段がありません。
558</p>
559
560<p>ユーザーがアクティビティに戻るのを防ぐには、<code><a href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code> エレメントの <a href="{@docRoot}guide/topics/manifest/activity-element.html#finish">{@code finishOnTaskLaunch}</a> を {@code "true"} に設定します(<a href="#Clearing">スタックをクリアする</a>をご覧ください)。
561
562
563
564</p>
565
566<p>オーバービュー画面でのタスクとアクティビティの表示方法と管理方法の詳細については、「<a href="{@docRoot}guide/components/recents.html">オーバービュー画面</a>」をご覧ください。
567
568</p>
569
570<!--
571<h2>Beginner's Path</h2>
572
573<p>For more information about how to use intents to
574activate other application components and publish the intents to which your components
575respond, continue with the <b><a
576href="{@docRoot}guide/components/intents-filters.html">Intents and Intent
577Filters</a></b> document.</p>
578-->
579