【Android必备】最近的屏幕(20)

概要


“ 最近”屏幕(也称为“概览”屏幕,最近的任务列表或最近的应用程序)是一个系统级用户界面,列出了最近访问的 活动和任务。用户可以在列表中导航并选择要恢复的任务,或者用户可以通过将其移除而从列表中删除任务。Android 5.0(API级别21)引入了一个以 文档为中心的 模型,其中包含不同文档的同一活动的多个实例可能会在“ 最近”屏幕中显示为任务。例如,Google云端硬盘可能针对多个Google文档中的每一个都有一项任务。每个文档在“ 最近”屏幕中显示为一项任务。
【Android必备】最近的屏幕(20)
图1. “ 最近”屏幕显示三个Google Drive文档,每个文档都表示为一个单独的任务。

另一个常见的例子是当用户使用他们的浏览器时,他们点击分享 > Gmail。出现Gmail应用程序的撰写屏幕。当时点击最近按钮显示Chrome和Gmail作为单独的任务运行。在较低版本的Android中,所有活动都显示为一项任务,使后退按钮成为唯一的导航工具。图2显示了最新版本的Android 5.0及更高版本与最低版本的平台之间的最新版本。Android 5.0及更高版本左侧屏幕上的图像以及右侧图像显示了Android在较低版本中的显示效果。
【Android必备】最近的屏幕(20)
通常情况下,您应该允许系统定义您的任务和活动在最近屏幕中的表现方式,而不需要修改此行为。但是,您的应用可以确定活动在“ 最近”屏幕中的显示方式和时间。本 ActivityManager.AppTask类可用于管理任务和活性标志Intent类让你指定在一个活动中添加或移除的最近通话屏幕。此外,这些 <activity>属性可让您在清单中设置行为。

有关以文档为中心的模型的更多信息,请参阅 此博客文章

将任务添加到最近的屏幕


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

使用意图标志来添加任务

当你为你的活动创建一个新文档时,你调用该 startActivity() 方法,并传递启动该活动的意图。要插入逻辑分隔符以便系统将您的活动作为新任务在最近屏幕FLAG_ACTIVITY_NEW_DOCUMENT中addFlags()处理,请在Intent 启动活动的方法中传递该标志

注意:该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"在清单中设置的属性值(默认值)。

当主要活动启动新活动时,系统将搜索其意向与活动的意图组件名称和意向数据匹配的现有任务。如果找不到任务,或者意图包含该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标志相同,如上面的 使用意图标志添加任务所述。

“ always”
该活动为文档创建新任务,即使文档已打开。使用此值与设置FLAG_ACTIVITY_NEW_DOCUMENT 和FLAG_ACTIVITY_MULTIPLE_TASK标志相同。

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

“ never”
该活动不会为该文档创建新任务。设置此值将覆盖FLAG_ACTIVITY_NEW_DOCUMENT 和FLAG_ACTIVITY_MULTIPLE_TASK标志的行为(如果其中任何一个设置为意图),并且最近接受屏幕显示应用程序的单个任务,该任务从用户上次调用的任何活动恢复。

注意:对于除此之外的值none以及never必须使用定义的活动launchMode="standard"。如果未指定此属性,documentLaunchMode="none"则使用该属性 。

删除任务


默认情况下,当活动完成时,文档任务会自动从“ 最近”屏幕中删除。您可以用ActivityManager.AppTask类,Intent标志或 <activity>属性覆盖此行为。

您始终可以通过将 属性设置为来从“ 最近”屏幕中 排除任务。<activity> android:excludeFromRecentstrue

您可以通过将 属性设置为整数值来设置应用程序可以包含在“ 最近”屏幕中的最大任务数。默认值是16.当达到最大任务数时,最近最少使用的任务将从“ 最近”屏幕中删除。的最大值为50(25低存储器设备); 小于1的值无效。<activity>android:maxRecents android:maxRecents

使用AppTask类删除任务

在“ 最近”屏幕中创建新任务的活动中,您可以指定何时移除任务并通过调用finishAndRemoveTask()方法完成与其关联的所有活动。

public void onRemoveFromRecents(View view) {
    // The document is no longer needed; remove its task. 
    finishAndRemoveTask(); 
} 

注意:使用该 finishAndRemoveTask()方法会覆盖FLAG_ACTIVITY_RETAIN_IN_RECENTS标签的使用,如下所述。

保留完成的任务

如果要在“ 最近”屏幕中保留任务,即使其活动已完成,也要FLAG_ACTIVITY_RETAIN_IN_RECENTS在addFlags()启动活动的方法中传递该标志 。

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, getAndIncrement());
    return newDocumentIntent;
} 

要达到相同的效果,请将该<activity> 属性设置 为。默认值 用于文档活动和常规活动。使用此属性将覆盖之前讨论过的标志。 android:autoRemoveFromRecentsfalsetruefalseFLAG_ACTIVITY_RETAIN_IN_RECENTS

其他示例代码


要下载有关以文档为中心的应用程序的示例应用程序,请参阅 Android DocumentCentricRecents示例Android DocumentCentricRelinquishIdentity示例

Lastest Update:2018.04.27

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Android必备】最近的屏幕(20)

猜你喜欢

转载自blog.51cto.com/4789781/2122481