如下图:Google Drive 中多个 document 组成一个task呈现在 overview screen中
通常来说,你应该允许系统决定你的task和activity是如何展现在overview screen 中的,而且你也不应该去修改这种行为。
但是你的app却可以确定何时、怎样出现在overview scree中。ActivityManager.AppTask 类能够让用户自己管理task,当然我们也可以在manifest文件中利用 Intent 类的flag 标签来描述一个activity是何时添加和从overview scren 中移除
使用 Intent 类的 Flag 标签在 overview screen 中添加task能狗提供关于一个document 在overview screen 中打开或者是重新打开的更大控制权
当你使用 <activity>属性,你则可以选择永远在一个新 task 中打开一个document 或者是为该document reuse 一个已经存在的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>
<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>
在一个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” 属性就会被使用
默认情况下,当一个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
在一个你在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,如下面所述
如果想要在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>