2014-09-15 14:08:44 -07:00
|
|
|
page.title=Overview Screen
|
|
|
|
page.tags="recents","overview"
|
|
|
|
|
|
|
|
@jd:body
|
|
|
|
|
|
|
|
<div id="qv-wrapper">
|
|
|
|
<div id="qv">
|
|
|
|
|
|
|
|
<h2>In this document</h2>
|
|
|
|
<ol>
|
|
|
|
<li><a href="#adding">Adding Tasks to the Overview Screen</a>
|
|
|
|
<ol>
|
|
|
|
<li><a href="#flag-new-doc">Using the Intent flag to add a task</a></li>
|
|
|
|
<li><a href="#attr-doclaunch">Using the Activity attribute to add a task</a></li>
|
|
|
|
</ol>
|
|
|
|
</li>
|
|
|
|
<li><a href="#removing">Removing Tasks</a>
|
|
|
|
<ol>
|
|
|
|
<li><a href="#apptask-remove">Using the AppTask class to remove tasks</a></li>
|
|
|
|
<li><a href="#retain-finished">Retaining finished tasks</a></li>
|
|
|
|
</ol>
|
|
|
|
</li>
|
|
|
|
</ol>
|
|
|
|
|
|
|
|
<h2>Key classes</h2>
|
|
|
|
<ol>
|
|
|
|
<li>{@link android.app.ActivityManager.AppTask}</li>
|
|
|
|
<li>{@link android.content.Intent}</li>
|
|
|
|
</ol>
|
|
|
|
|
|
|
|
<h2>Sample code</h2>
|
|
|
|
<ol>
|
2014-10-17 10:46:04 -07:00
|
|
|
<li><a href="{@docRoot}samples/DocumentCentricApps/index.html">Document-centric Apps</a></li>
|
2014-09-15 14:08:44 -07:00
|
|
|
</ol>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<p>The overview screen (also referred to as the recents screen, recent task list, or recent apps)
|
|
|
|
is a system-level UI that lists recently accessed <a href="{@docRoot}guide/components/activities.html">
|
|
|
|
activities</a> and <a href="{@docRoot}guide/components/tasks-and-back-stack.html">tasks</a>. The
|
|
|
|
user can navigate through the list and select a task to resume, or the user can remove a task from
|
|
|
|
the list by swiping it away. With the Android 5.0 release (API level 21), multiple instances of the
|
|
|
|
same activity containing different documents may appear as tasks in the overview screen. For example,
|
|
|
|
Google Drive may have a task for each of several Google documents. Each document appears as a
|
|
|
|
task in the overview screen.</p>
|
|
|
|
|
|
|
|
<img src="{@docRoot}images/components/recents.png" alt="" width="284" />
|
|
|
|
<p class="img-caption"><strong>Figure 1.</strong> The overview screen showing three Google Drive
|
|
|
|
documents, each represented as a separate task.</p>
|
|
|
|
|
|
|
|
<p>Normally you should allow the system to define how your tasks and
|
|
|
|
activities are represented in the overview screen, and you don't need to modify this behavior.
|
|
|
|
However, your app can determine how and and when activities appear in the overview screen. The
|
|
|
|
{@link android.app.ActivityManager.AppTask} class lets you manage tasks, and the activity flags of
|
|
|
|
the {@link android.content.Intent} class let you specify when an activity is added or removed from
|
|
|
|
the overview screen. Also, the <code><a href="{@docRoot}guide/topics/manifest/activity-element.html">
|
|
|
|
<activity></a></code> attributes let you set the behavior in the manifest.</p>
|
|
|
|
|
|
|
|
<h2 id="adding">Adding Tasks to the Overview Screen</h2>
|
|
|
|
|
|
|
|
<p>Using the flags of the {@link android.content.Intent} class to add a task affords greater control
|
|
|
|
over when and how a document gets opened or reopened in the overview screen. When you use the
|
|
|
|
<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code>
|
|
|
|
attributes you can choose between always opening the document in a new task or reusing an
|
|
|
|
existing task for the document.</p>
|
|
|
|
|
|
|
|
<h3 id="flag-new-doc">Using the Intent flag to add a task</h3>
|
|
|
|
|
|
|
|
<p>When you create a new document for your activity, you call the
|
|
|
|
{@link android.app.ActivityManager.AppTask#startActivity(android.content.Context, android.content.Intent, android.os.Bundle) startActivity()}
|
|
|
|
method of the {@link android.app.ActivityManager.AppTask} class, passing to it the intent that
|
|
|
|
launches the activity. To insert a logical break so that the system treats your activity as a new
|
|
|
|
task in the overview screen, pass the {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} flag
|
|
|
|
in the {@link android.content.Intent#addFlags(int) addFlags()} method of the {@link android.content.Intent}
|
|
|
|
that launches the activity.</p>
|
|
|
|
|
|
|
|
<p class="note"><strong>Note:</strong> The {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT}
|
|
|
|
flag replaces the {@link android.content.Intent#FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET} flag,
|
|
|
|
which is deprecated as of Android 5.0 (API level 21).</p>
|
|
|
|
|
|
|
|
<p>If you set the {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} flag when you create
|
|
|
|
the new document, the system always creates a new task with the target activity as the root.
|
|
|
|
This setting allows the same document to be opened in more than one task. The following code demonstrates
|
|
|
|
how the main activity does this:</p>
|
|
|
|
|
2014-10-17 10:46:04 -07:00
|
|
|
<p class="code-caption"><a href="{@docRoot}samples/DocumentCentricApps/index.html">
|
2014-09-15 14:08:44 -07:00
|
|
|
DocumentCentricActivity.java</a></p>
|
|
|
|
<pre>
|
|
|
|
public void createNewDocument(View view) {
|
|
|
|
final Intent newDocumentIntent = newDocumentIntent();
|
|
|
|
if (useMultipleTasks) {
|
|
|
|
newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
|
|
|
|
}
|
|
|
|
startActivity(newDocumentIntent);
|
|
|
|
}
|
|
|
|
|
|
|
|
private Intent newDocumentIntent() {
|
|
|
|
boolean useMultipleTasks = mCheckbox.isChecked();
|
|
|
|
final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class);
|
|
|
|
newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
|
|
|
|
newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, incrementAndGet());
|
|
|
|
return newDocumentIntent;
|
|
|
|
}
|
|
|
|
|
|
|
|
private static int incrementAndGet() {
|
|
|
|
Log.d(TAG, "incrementAndGet(): " + mDocumentCounter);
|
|
|
|
return mDocumentCounter++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
<p class="note"><strong>Note:</strong> Activities launched with the {@code FLAG_ACTIVITY_NEW_DOCUMENT}
|
|
|
|
flag must have the {@code android:launchMode="standard"} attribute value (the default) set in the
|
|
|
|
manifest.</p>
|
|
|
|
|
|
|
|
<p>When the main activity launches a new activity, the system searches through existing tasks for
|
|
|
|
one whose intent matches the intent component name and the Intent data for the activity. If the task
|
|
|
|
is not found, or the intent contained the {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK}
|
|
|
|
flag, a new task will be created with the activity as its root. If it finds one, it brings that task
|
|
|
|
to the front and passes the new intent to {@link android.app.Activity#onNewIntent onNewIntent()}.
|
|
|
|
The new activity gets the intent and creates a new document in the overview screen, as in the
|
|
|
|
following example:</p>
|
|
|
|
|
2014-10-17 10:46:04 -07:00
|
|
|
<p class="code-caption"><a href="{@docRoot}samples/DocumentCentricApps/index.html">
|
2014-09-15 14:08:44 -07:00
|
|
|
NewDocumentActivity.java</a></p>
|
|
|
|
<pre>
|
|
|
|
@Override
|
|
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
|
|
super.onCreate(savedInstanceState);
|
|
|
|
setContentView(R.layout.activity_new_document);
|
|
|
|
mDocumentCount = getIntent()
|
|
|
|
.getIntExtra(DocumentCentricActivity.KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0);
|
|
|
|
mDocumentCounterTextView = (TextView) findViewById(
|
|
|
|
R.id.hello_new_document_text_view);
|
|
|
|
setDocumentCounterText(R.string.hello_new_document_counter);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void onNewIntent(Intent intent) {
|
|
|
|
super.onNewIntent(intent);
|
|
|
|
/* If FLAG_ACTIVITY_MULTIPLE_TASK has not been used, this activity
|
|
|
|
is reused to create a new document.
|
|
|
|
*/
|
|
|
|
setDocumentCounterText(R.string.reusing_document_counter);
|
|
|
|
}
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
|
|
<h3 id="#attr-doclaunch">Using the activity attribute to add a task</h3>
|
|
|
|
|
|
|
|
<p>An activity can also specify in its manifest that it always launches into a new task by using
|
|
|
|
the <code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code>
|
|
|
|
attribute, <a href="{@docRoot}guide/topics/manifest/activity-element.html#dlmode">
|
|
|
|
{@code android:documentLaunchMode}</a>. This attribute has four values which produce the following
|
|
|
|
effects when the user opens a document with the application:</p>
|
|
|
|
|
|
|
|
<dl>
|
|
|
|
<dt>"{@code intoExisting}"</dt>
|
|
|
|
<dd>The activity reuses an existing task for the document. This is the same as setting the
|
|
|
|
{@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} flag <em>without</em> setting the
|
|
|
|
{@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} flag, as described in
|
|
|
|
<a href="#flag-new-doc">Using the Intent flag to add a task</a>, above.</dd>
|
|
|
|
|
|
|
|
<dt>"{@code always}"</dt>
|
|
|
|
<dd>The activity creates a new task for the document, even if the document is already opened. Using
|
|
|
|
this value is the same as setting both the {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT}
|
|
|
|
and {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} flags.</dd>
|
|
|
|
|
|
|
|
<dt>"{@code none”}"</dt>
|
|
|
|
<dd>The activity does not create a new task for the document. The overview screen treats the
|
|
|
|
activity as it would by default: it displays a single task for the app, which
|
|
|
|
resumes from whatever activity the user last invoked.</dd>
|
|
|
|
|
|
|
|
<dt>"{@code never}"</dt>
|
|
|
|
<dd>The activity does not create a new task for the document. Setting this value overrides the
|
|
|
|
behavior of the {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT}
|
|
|
|
and {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} flags, if either of these are set
|
|
|
|
in the intent, and the overview screen displays a single task for the app, which resumes from
|
|
|
|
whatever activity the user last invoked.</dd>
|
|
|
|
</dl>
|
|
|
|
|
|
|
|
<p class="note"><strong>Note:</strong> For values other than {@code none} and {@code never} the
|
|
|
|
activity must be defined with {@code launchMode="standard"}. If this attribute is not specified,
|
|
|
|
{@code documentLaunchMode="none"} is used.</p>
|
|
|
|
|
|
|
|
<h2 id="removing">Removing Tasks</h2>
|
|
|
|
|
|
|
|
<p>By default a document task is automatically removed from the overview screen when its activity
|
|
|
|
finishes. You can override this behavior with the {@link android.app.ActivityManager.AppTask} class,
|
|
|
|
with an {@link android.content.Intent} flag, or with an<code><a href="{@docRoot}guide/topics/manifest/activity-element.html">
|
|
|
|
<activity></a></code> attribute.</p>
|
|
|
|
|
|
|
|
<p>You can always exclude a task from the overview screen entirely by setting the
|
|
|
|
<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code>
|
|
|
|
attribute, <a href="{@docRoot}guide/topics/manifest/activity-element.html#exclude">
|
|
|
|
{@code android:excludeFromRecents}</a> to {@code true}.</p>
|
|
|
|
|
|
|
|
<p>You can set the maximum number of tasks that your app can include in the overview screen by setting
|
|
|
|
the <code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code>
|
|
|
|
attribute <a href="{@docRoot}guide/topics/manifest/activity-element.html#maxrecents">{@code android:maxRecents}
|
|
|
|
</a> to an integer value. The default is 16. When the maximum number of tasks is reached, the least
|
|
|
|
recently used task is removed from the overview screen. The {@code android:maxRecents} maximum value
|
|
|
|
is 50 (25 on low memory devices); values less than 1 are not valid.</p>
|
|
|
|
|
|
|
|
<h3 id="#apptask-remove">Using the AppTask class to remove tasks</h3>
|
|
|
|
|
|
|
|
<p>In the activity that creates a new task in the overview screen, you can
|
|
|
|
specify when to remove the task and finish all activities associated with it by calling
|
|
|
|
the {@link android.app.ActivityManager.AppTask#finishAndRemoveTask() finishAndRemoveTask()} method.</p>
|
|
|
|
|
2014-10-17 10:46:04 -07:00
|
|
|
<p class="code-caption"><a href="{@docRoot}samples/DocumentCentricApps/index.html">
|
2014-09-15 14:08:44 -07:00
|
|
|
NewDocumentActivity.java</a></p>
|
|
|
|
<pre>
|
|
|
|
public void onRemoveFromRecents(View view) {
|
|
|
|
// The document is no longer needed; remove its task.
|
|
|
|
finishAndRemoveTask();
|
|
|
|
}
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
<p class="note"><strong>Note:</strong> Using the
|
|
|
|
{@link android.app.ActivityManager.AppTask#finishAndRemoveTask() finishAndRemoveTask()} method
|
|
|
|
overrides the use of the {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS} tag,
|
|
|
|
discussed below.</p>
|
|
|
|
|
|
|
|
<h3 id="#retain-finished">Retaining finished tasks</h3>
|
|
|
|
|
|
|
|
<p>If you want to retain a task in the overview screen, even if its activity has finished, pass
|
|
|
|
the {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS} flag in the
|
|
|
|
{@link android.content.Intent#addFlags(int) addFlags()} method of the Intent that launches the activity.</p>
|
|
|
|
|
2014-10-17 10:46:04 -07:00
|
|
|
<p class="code-caption"><a href="{@docRoot}samples/DocumentCentricApps/index.html">
|
2014-09-15 14:08:44 -07:00
|
|
|
DocumentCentricActivity.java</a></p>
|
|
|
|
<pre>
|
|
|
|
private Intent newDocumentIntent() {
|
|
|
|
final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class);
|
|
|
|
newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT |
|
|
|
|
android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS);
|
|
|
|
newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, incrementAndGet());
|
|
|
|
return newDocumentIntent;
|
|
|
|
}
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
<p>To achieve the same effect, set the
|
|
|
|
<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code>
|
|
|
|
attribute <a href="{@docRoot}guide/topics/manifest/activity-element.html#autoremrecents">
|
|
|
|
{@code android:autoRemoveFromRecents}</a> to {@code false}. The default value is {@code true}
|
|
|
|
for document activities, and {@code false} for regular activities. Using this attribute overrides
|
|
|
|
the {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS} flag, discussed previously.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|