最近的屏幕
“最近”屏幕(也称为“概述”屏幕,最近的任务列表或最近的应用程序)是一个系统级UI,列出最近访问的活动和任务。 用户可以浏览列表并选择要恢复的任务,或者用户可以通过将其擦除来从列表中删除任务。 Android 5.0
(API级别21)引入了以文档为中心的模型,其中包含不同文档的同一活动的多个实例可能在“最近”屏幕中显示为任务。 例如,Google
云端硬盘可能会为多个Google
文档中的每个文档执行任务。 每个文档在“最近”屏幕中显示为任务。
在较低版本的Android
中,所有活动都显示为单个任务,使“后退”按钮成为唯一的导航方式。 图2显示了与平台的较低版本相比,最高安卓屏幕在Android 5.0
及更高版本中的外观。 Android 5.0
及更高版本的左侧屏幕上的图像,右侧的图像显示了它在Android
的较低版本中的显示方式。
通常,您应该允许系统在“最近”屏幕中定义您的任务和活动的表示方式,而不需要修改此行为。 但是,您的应用可以确定活动在“最近”屏幕中的显示方式和时间。 ActivityManager.AppTask
类允许您管理任务,并且Intent
类的活动标志允许您指定何时在“最近”窗口中添加或删除活动。 此外,<activity>
属性允许您在清单中设置行为。
一、将任务添加到最近的屏幕
使用Intent
类的标志添加任务可以更好地控制文档在“最近”屏幕中何时以及如何打开或重新打开。 使用<activity>
属性时,可以选择始终在新任务中打开文档,还是重复使用文档的现有任务。
使用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属性添加任务
活动还可以在其清单中指定它始终通过使用<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
标志或使用<activity>
属性覆盖此行为。
您始终可以通过将<activity>
属性android:excludeFromRecents
设置为true来完全从“最近”屏幕中排除任务。
您可以通过将<activity>
属性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; }
要达到相同的效果,请将<activity>
属性android:autoRemoveFromRecents
设置为false
。 文档活动的默认值为true
,常规活动的默认值为false
。 使用此属性会覆盖之前讨论的FLAG_ACTIVITY_RETAIN_IN_RECENTS
标志。
三、附加示例代码
要下载有关以文档为中心的应用程序的示例应用程序,请参阅Android DocumentCentricRecents
示例和Android DocumentCentricRelinquishIdentity
示例。