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