最近的屏幕

“最近”屏幕(也称为“概述”屏幕,最近的任务列表或最近的应用程序)是一个系统级UI,列出最近访问的活动和任务。 用户可以浏览列表并选择要恢复的任务,或者用户可以通过将其擦除来从列表中删除任务。 Android 5.0(API级别21)引入了以文档为中心的模型,其中包含不同文档的同一活动的多个实例可能在“最近”屏幕中显示为任务。 例如,Google云端硬盘可能会为多个Google文档中的每个文档执行任务。 每个文档在“最近”屏幕中显示为任务。

图1.“最近”屏幕显示三个`Google Drive`文档,每个文档都表示为一个单独的任务。

在较低版本的Android中,所有活动都显示为单个任务,使“后退”按钮成为唯一的导航方式。 图2显示了与平台的较低版本相比,最高安卓屏幕在Android 5.0及更高版本中的外观。 Android 5.0及更高版本的左侧屏幕上的图像,右侧的图像显示了它在Android的较低版本中的显示方式。

图2. Android 5.0及更高版本(左)和低于Android 5.0(右)的版本中的Recents屏幕。

通常,您应该允许系统在“最近”屏幕中定义您的任务和活动的表示方式,而不需要修改此行为。 但是,您的应用可以确定活动在“最近”屏幕中的显示方式和时间。 ActivityManager.AppTask类允许您管理任务,并且Intent类的活动标志允许您指定何时在“最近”窗口中添加或删除活动。 此外,属性允许您在清单中设置行为。

一、将任务添加到最近的屏幕

使用Intent类的标志添加任务可以更好地控制文档在“最近”屏幕中何时以及如何打开或重新打开。 使用属性时,可以选择始终在新任务中打开文档,还是重复使用文档的现有任务。

使用Intent标志添加任务

为活动创建新文档时,可以调用startActivity()方法,并向其传递启动活动的意图。 要插入逻辑中断以便系统将您的活动视为“最近”屏幕中的新任务,请在启动活动的IntentaddFlags()方法中传递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_DOCUMENTFLAG_ACTIVITY_MULTIPLE_TASK标志相同。

"none"

活动不会为文档创建新任务。 “最近”窗口按默认情况处理活动:它显示应用程序的单个任务,该任务从用户上次调用的任何活动中恢复。

"never"

活动不会为文档创建新任务。 设置此值将覆盖FLAG_ACTIVITY_NEW_DOCUMENTFLAG_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示例。

你可能感兴趣的:(最近的屏幕)