在Android L 中,一个activity里面会包含多个事件,故一个Activity中会有多个文件(document)以task的形式出现在overview screen中
如下图:Google Drive 中多个 document 组成一个task呈现在 overview screen中
通常来说,你应该允许系统决定你的task和activity是如何展现在overview screen 中的,而且你也不应该去修改这种行为。
但是你的app却可以确定何时、怎样出现在overview scree中。ActivityManager.AppTask 类能够让用户自己管理task,当然我们也可以在manifest文件中利用 Intent 类的flag 标签来描述一个activity是何时添加和从overview scren 中移除
在 Overview Screen 中添加 Task
使用 Intent 类的 Flag 标签在 overview screen 中添加task能狗提供关于一个document 在overview screen 中打开或者是重新打开的更大控制权
当你使用 <activity>属性,你则可以选择永远在一个新 task 中打开一个document 或者是为该document reuse 一个已经存在的task
使用 Intent flag 添加一个task
当你调用ActivityManager.AppTask类中的 startActivity() 方法时,当前的activity就会创建一个新的document,并给该document 传递一个 Intent 。 如果在给Intent 中添加 addFlags() 方法,并传递 flag:FLAG_ACTIVITY_NEW_DOCUMENT ,系统就会将创建的Activity 作为一个新的task显示在 overview screen中
注意:标签 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 在 Android 5.0 中已经弃用,替换为:FLAG_ACTIVITY_NEW_DOCUMENT
当你创建一个新的document的时候,如果在 Intent 中添加了 FLAG_ACTIVITY_MULTIPLE_TASK 标签,那么系统将会永远新建一个新的task,并把目标Activity设置为该task 的 root,这样就允许同一个 document 在多个task中打开。
具体实例如下:
<span style="font-family:Microsoft YaHei;font-size:14px;">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, incrementAndGet());
return newDocumentIntent;
}
private static int incrementAndGet() {
Log.d(TAG, "incrementAndGet(): " + mDocumentCounter);
return mDocumentCounter++;
}
}</span>
注意:被启动的Activity 如果被设置了FLAG_ACTIVITY_NEW_DOCUMENT 标签,那么它必须在mainfest 文件中设置启动属性为: android:launchMode="standard"
当主activity要启动一个新的activity的时候,系统就会搜索当前存在的task中哪个Intent 的 action name 和 Intent data 与主activity 传递过来的 Intent 匹配。关于Intent 是如何解析的,可以参考博客 Android Intent Filter 简析
如果没有找到匹配的task,或者是 主activity 的Intent 中包含FLAG_ACTIVITY_MULTIPLE_TASK 标签,那么系统就会新建一个task,并把该activity作为root activity
如果系统找到了一个匹配的task,则会将该task放到栈顶并传递一个Intent,新的activity 就会获取到这个Intent 并在overview screen 中创建一个新的document
实例如下:
<span style="font-family:Microsoft YaHei;font-size:14px;">@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);
}</span>
使用 activit 属性添加task
在一个activity在mainfest文件中添加 属性:android:documentLaunchMode 时,该activity被启动时永远会创建一个新的task。该属性有4个值,用户在应用中打开一个document时会有不同的效果:
intoExisting: activity 会为该document请求一个已经存在的task,这与 设置FLAG_ACTIVITY_NEW_DOCUMENT 且不设置 FLAG_ACTIVITY_MULTIPLE_TASK 有相同的效果
always: activity 会为该document创建一个新的task,即使该document已经被打开了,这与设置 FLAG_ACTIVITY_NEW_DOCUMENT 且设置 FLAG_ACTIVITY_MULTIPLE_TASK 有相同的效果
none:activity 不会为 document 创建新的task,该app被设置为 single task 的模式,它会重新调用用户唤醒的所有activity中的最近的一个
never:activity 不会为document创建一个新的task,设置这个值复写了 FLAG_ACTIVITY_NEW_DOCUMENT 和 FLAG_ACTIVITY_MULTIPLE_TASK 标签。如果其中一个标签被设置,并且overview screen 显示该app为 single task 模式。 则该activity 会重新调用用户最近唤醒的activity
注意: none 或 nerver 使用时,activity必须设置为 launchMode=”standard” ,如果该属性没有设置,documentLaunchMode=”none” 属性就会被使用
移除Tasks
默认情况下,当一个activity 被 finished 的时候,它的document tasks 就会被自动从 overview screen 中移除,然而,你也可以通过设置 <activity>的 android:excludeFromRecents 属性为true 来在overview screen 中移除 task
通过在 标签中设置 android:maxRecents 属性为一个 integer 类型的值,可以设置你的app在overview screen 中可以包含的task的最小值,默认是16,默认最大值是50,内存较低的可能为25.当overview screen中包含的一个app 的task到达最大值的时候,最近最少使用的task就会被移出overview screen
使用 AppTask 类 去移除 tasks
在一个你在overview screen中创建了一个task的activity中。你可以通过调用finishAndRemoveTask() 函数描述何时移除task 并结束所有的activitys 之间的关联
实例如下:
<span style="font-family:Microsoft YaHei;font-size:14px;">public void onRemoveFromRecents(View view) {
// The document is no longer needed; remove its task.
finishAndRemoveTask();
}</span>
注意:使用finishAndRemoveTask() 函数的方法复写了 FLAG_ACTIVITY_RETAIN_IN_RECENTS Tag,如下面所述
保留 finished 的 tasks
如果想要在overview screen 中保留一个task,即使它所属的activity 已经 finish 了,可以在要启动该activity的Intent中添加flag:FLAG_ACTIVITY_RETAIN_IN_RECENTS
实例如下:
<span style="font-family:Microsoft YaHei;font-size:14px;">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;
}</span>
同样的,在mainfest文件的<activity> 标签中设置属性: android:autoRemoveFromRecents 为false也有相同效果