您的位置:首页 > 移动开发 > Android开发

Android Overview Screen -- 概览界面

2015-08-25 02:47 435 查看

Android Overview Screen – 概览界面

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

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



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

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_document);
// TODO something
}

@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.
*/
}


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_DOCUMENT
FLAG_ACTIVITY_MULTIPLE_TASK
标志位。

none

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

never

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

NOTE: 当参数不选择
none
never
时,活动必须被定义为:
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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: