屏幕概览
概述屏幕(也称为最近屏幕,最近任务列表或最近的应用程序)是一个系统级UI,列出最近访问的Activity和任务。用户可以浏览列表并选择要恢复的任务,或者用户可以通过将其擦除来从列表中删除任务。使用Android 5.0版本(API级别21)时,包含不同文档的同一Activity的多个实例可能在概览屏幕中显示为任务。例如,Google云端硬盘可能会为多个Google文档中的每个文档执行任务。每个文档在概览屏幕中显示为任务。
通常,您应该允许系统定义在概览屏幕中表示任务和Activity的方式,而您不需要修改此行为。您的应用也可以指定活动在概览屏幕中的显示方式和时间。 ActivityManager.AppTask类允许您管理任务,Intent类的活动标志允许您指定在概览屏幕中添加或删除Activity的时间。此外,在清单文件中使用<activity>属性可以设置一些的行为。
将任务添加到概述屏幕
使用Intent类的标志添加任务可以更好地控制在概览屏幕中何时以及如何打开或重新打开文档。当您使用<activity>时您可以在始终在新任务中打开文档或重复使用文档的现有任务之间进行选择。
使用Intent标志添加任务
为Activity创建新文档时,可以调用ActivityManager.AppTask类的startActivity()方法,并向其传递启动Activity的意图。要插入逻辑中断以便系统将您的活动视为概览屏幕中的新任务,请在启动活动的Intent的addFlags()方法中传递FLAG_ACTIVITY_NEW_DOCUMENT标志。
注意:FLAG_ACTIVITY_NEW_DOCUMENT标志替换了FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET标志,该标志自Android 5.0(API级别21)起不推荐使用。
如果在创建新文档时设置FLAG_ACTIVITY_MULTIPLE_TASK标志,则系统始终会创建一个以目标活动为根的新任务。此设置允许在多个任务中打开同一文档。以下代码演示了主要Activity如何执行此操作:
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++;
}
}
注意:使用FLAG_ACTIVITY_NEW_DOCUMENT标志启动的Activity必须在清单中设置android:launchMode =“standard”属性值(默认值)。
当主Activity启动新Activity时,系统会在现有任务中搜索其意图与意图组件名称和活动的Intent数据匹配的任务。如果未找到任务,或者intent包含FLAG_ACTIVITY_MULTIPLE_TASK标志,则将创建一个以该Activity为根的新任务。如果找到一个,它会将该任务带到前台并将新意图传递给onNewIntent()。新Activity获取意图并在概览屏幕中创建新文档,如以下示例所示:
@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);
}
使用activity属性添加任务
Activity还可以在其清单中指定<activity> android:documentLaunchMode属性来设置始终启动到新任务中。此属性有四个值,当用户使用应用程序打开文档时,这些值会产生以下效果:
"intoExisting
"
该Activity重用该文档的现有任务。这与设置FLAG_ACTIVITY_NEW_DOCUMENT标志而不设置FLAG_ACTIVITY_MULTIPLE_TASK标志相同,如上面使用Intent标志添加任务中所述。
"always
"
即使文档已经打开,Activity也会为文档创建新任务。使用此值与设置FLAG_ACTIVITY_NEW_DOCUMENT和FLAG_ACTIVITY_MULTIPLE_TASK标志相同。
"none
"
Activity不会为文档创建新任务。概述屏幕默认处理Activity:它显示应用程序的单个任务,该任务从用户上次调用的任何Activity中恢复。
"never
"
Activity不会为文档创建新任务。则设置此值将覆盖FLAG_ACTIVITY_NEW_DOCUMENT和FLAG_ACTIVITY_MULTIPLE_TASK标志的行为,并且概述屏幕将显示应用程序的单个任务,该任务将从用户上次调用的任何活动中恢复。
注意:对于
never
和
none
以外的值,必须使用launchMode =“standard”定义Activity。如果未指定此属性,则相当于使用documentLaunchMode =“none”。
删除任务
默认情况下,文档任务在其Activity完成时会自动从概览屏幕中删除。您可以使用ActivityManager.AppTask类,使用Intent标志或使用<activity>的属性覆盖此行为。
您可以通过设置<activity>完全从概览屏幕中排除任务。属性,android:excludeFromRecents为true。
您可以通过<activity>属性来设置应用可以在概览屏幕中包含的最大任务数。android:maxRecents为整数值。默认值为16.达到最大任务数时,将从概览屏幕中删除最近最少使用的任务。 android:maxRecents最大值为50(低内存设备上为25);小于1的值无效。
使用AppTask类删除任务
在概述屏幕中创建新任务的Activity中,您可以通过调用finishAndRemoveTask()方法指定何时删除任务并finish与其关联的所有Activity。
public void onRemoveFromRecents(View view) {
// The document is no longer needed; remove its task.
finishAndRemoveTask();
}
注意:使用finishAndRemoveTask()方法会覆盖使用FLAG_ACTIVITY_RETAIN_IN_RECENTS标记,如下所述。
保留完成的任务
如果要在概览屏幕中保留任务,即使其Activity已finished,要在启动Activity的Intent的addFlags()方法中传递FLAG_ACTIVITY_RETAIN_IN_RECENTS标志。
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;
}
要达到相同的效果,请设置<activity>属性android:autoRemoveFromRecents为false。文档Activity的默认值为true,常规Activity的默认值为false。使用此属性会覆盖之前讨论的FLAG_ACTIVITY_RETAIN_IN_RECENTS标志。