当前位置: 代码迷 >> Android >> Android Overview Screen - 统观界面
  详细解决方案

Android Overview Screen - 统观界面

热度:463   发布时间:2016-04-27 23:18:27.0
Android Overview Screen -- 概览界面

Android Overview Screen – 概览界面

原文链接:http://developer.android.com/guide/components/recents.html{:target=”_blank”}

概览界面(Overview Screen,通常也被叫做最近屏幕、最近任务列表、最近应用等)是一个系统级的界面,用来展示最近访问的一些活动(Activities)或者任务(Tasks)。用户可以通过上下滑动来浏览这个列表,并且可以选择一个任务来恢复或者通过左右滑动一个任务来把这个任务从这个概览界面里移除。从Android5.0(API等级为21)开始,包含不同文档Documents)的同一个活动的多个实例可能会作为多个任务出现在概览界面。例如,Google Drive这个应用会为它打开的每一篇文档都分配一个“任务”。这样,每一个文档都会以一个任务的形式在概览界面里显示。

recents

Figure 1. 这个概览界面展现了三篇Google Drive打开的文档,每一个都作为一个独立的任务来显示。

通常,你需要允许系统来定义你的任务和活动如何在概览界面上展现,而你却无需去修改这种行为。不过,你的App可以自己定义其中的活动在何时以何种方式出现在概览界面。你可以通过ActivityManager.AppTask来管理任务,以及通过Intent类中活动的标志位flags)来定义一个活动是在何时被添加或移除出概览屏幕的(这句话本学渣感觉翻的很别扭,哪位好心的同学可以帮忙留言纠正一下呀,原文如下:The ActivityManager.AppTask class lets you manage tasks, and the activity flags of the Intent class let you specify when an activity is added or removed from the overview screen.)。同样,我们可以配置清单文件中<activity>标签的属性来定义上述行为。

Adding Tasks to the Overview Screen – 往概览屏幕中添加任务

Intent类的标志位来新增一个任务,可以为一个在概览界面上的文档在何时以及如何被打开或重新打开增加更多的控制。而使用<activity>标签时,你可以决定在打开一个文档时,是使用一个新的任务亦或是重用一个已经存在的任务,而这种清单文件中定义的行为一旦定义则不会改变。

Using the Intent flag to add a task – 使用Intent类的标志位来添加一个任务

启动活动时,你应该把Intent传给ActivityManager.AppTask类的startActivity()方法,来为你的活动创建一个文档。如果要创建一个逻辑上的断点来让系统把你的活动作为一个新的任务显示在概览屏幕上,你应当把FLAG_ACTIVITY_NEW_DOCUMENT标志位传给用来来启动这个活动Intent对象的addFlag()方法。

NOTE: FLAG_ACTIVITY_NEW_DOCUMENT标志位已经取代了FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET,后者已经在Android5.0(API等级21)中过期了。

如果你创建一个新文档时用了FLAG_ACTIVITY_MULTIPLE_TASK标志位,则系统在每次打开这个活动时都会创建一个任务,并把这个活动作为根活动放进去。这种操作允许同样的文档在多个任务中打开。下面代码演示了主活动时如何做的:

DocumentCentricActivity.java

public void createNewDocument(View view) {      boolean useMultipleTasks = mCheckbox.isChecked();      final Intent newDocumentIntent = newDocumentIntent();      if (useMultipleTasks) {          newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);      }      startActivity(newDocumentIntent);  }  private Intent newDocumentIntent() {      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++;  }}

NOTE:FLAG_ACTIVITY_NEW_DOCUMENT标志位启动的活动,它在清单文件中定义的启动方式必须是默认启动方式:android:launchMode="standard"

当主活动用Intent启动一个新的活动时,系统会搜索所以存在的任务来找到一二任务,即这个任务的Intent符合当前Intent的组件名和数据。如果没找到符合的任务,或者这个Intent携带了一个FLAG_ACTIVITY_MULTIPLE_TASK标志位,一个新的任务会被创建,而这个即将启动的活动会作为这个任务的根活动。而如果找到了对应的任务,系统会把这个任务带回前台,并把新的Intent传递给活动的onNewIntent()方法。这个新的活动获得Intent并在开始概览屏幕上创建一个新的文档,如下面的代码所示:

NewDocumentActivity.java

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_new_document);    // TODO something}@Overrideprotected 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.     */}

Using the activity attribute to add a task – 用清单文件中“活动”标签的属性来添加一个任务

一个活动可以在清单文件中定义它总是启动到一个新的任务,即在“活动”标签中使用属性:android:documentLaunchMode。当用户打开一个文档时,这个参数有四种类型来产生不同的效果:

  • intoExisting

活动会重用已存在的任务。这个参数类似于Intent中添加了FLAG_ACTIVITY_NEW_DOCUMENT标志位,却没有添加FLAG_ACTIVITY_MULTIPLE_TASK,可以参考上面Using the Intent flag to add a task – 使用Intent类的标志位来添加一个任务的描述。

  • always

活动为这个文档创建一个新的任务,即使这个文档已经被打开。这个参数类似于Intent中同时添加了FLAG_ACTIVITY_NEW_DOCUMENTFLAG_ACTIVITY_MULTIPLE_TASK标志位。

  • none

活动不为这个文档创建一个新的任务。概览屏幕以默认方式对待这个活动,级:整个应用会作为一个任务在概览界面上显示,而概览屏幕会在用户选择这个应用后唤醒用户最后使用的活动。

  • never

活动不为这个文档创建一个新的任务。不同于none,设置这个参数会覆盖Intent中的FLAG_ACTIVITY_NEW_DOCUMENTFLAG_ACTIVITY_MULTIPLE_TASK标志位。即使这些标志位被设置,整个应用还是会作为一个任务在概览界面上显示,而概览屏幕会在用户选择这个应用后唤醒用户最后使用的活动。

NOTE: 当参数不选择nonenever时,活动必须被定义为:launchMode="standard"。如果android:documentLaunchMode参数没有被定义,则none参数会作为默认值。

Removing Tasks – 移除任务

默认情况下,一个带文档的任务会在它的活动被结束的时候自动从概览界面上移除。不过,你可以通过ActivityManager.AppTask类、Intent的标志位或者清单文件中“活动”标签的属性来覆盖这种行为。

你可以设置“活动”标签的属性来把一个任务排除在概览屏幕值外,即android:excludeFromRecents="true"

你可以定义你的应用在概览界面上显示的任务的数量的最大值,即android:maxRecents属性。这个属性是一个整型,默认值是16。当任务的数量到达最大值时,最近最少被使用的任务则会在概览界面上被移除。这个属性的最大值时50(低内存设备上是25),最小值为1.

Using the AppTask class to remove tasks – 用AppTask类来移除任务

在创建了一个新任务到概览屏幕的活动中,你可以定义何时移除这个任务,以及通过调用finishAndRemoveTask()方法来结束所有关联到这个任务上的活动。

NewDocumentActivity.java

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

NOTE: 使用finishAndRemoveTask()方法会覆盖下面提到的FLAG_ACTIVITY_RETAIN_IN_RECENTS标志位。

Retaining finished tasks – 保持已经结束的任务

如果你想在活动结束之后,依然在概览屏幕上显示这个任务,你可以在启动这个活动的Intent中添加FLAG_ACTIVITY_RETAIN_IN_RECENTS标志位。

DocumentCentricActivity.java

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;}

为了达成同样的效果,可以在清单文件的“活动”标签下添加android:autoRemoveFromRecents="false"。这个属性对于一般活动来说默认值为false,而对于设置了文档属性的活动来说,默认值则为true.而这个参数会覆盖上面提到的FLAG_ACTIVITY_RETAIN_IN_RECENTS标志位。

文章里用到的代码源码:点我下载{:target=”_blank”}

就这么多啦,用了两个晚上才搞定。翻的烂的地方请大家多包涵(学渣伤不起呀T.T)。

  相关解决方案