1 概述
概覽屏幕(也稱爲最新動態屏幕、最近任務列表或最近使用的應用)是一個系統級別 UI,其中列出了最近訪問過的 Activity 和任務。 用戶可以瀏覽該列表並選擇要恢復的任務,也可以通過滑動清除任務將其從列表中移除。 對於 Android 5.0 版本(API 級別 21),包含不同文檔的同一 Activity 的多個實例可能會以任務的形式顯示在概覽屏幕中。 例如,Google Drive 可能對多個 Google 文檔中的每個文檔均執行一個任務。 每個文檔均以任務的形式顯示在概覽屏幕中。如下圖所示:
圖 1. 顯示了三個 Google Drive 文檔的概覽屏幕,每個文檔分別以一個單獨的任務表示。
通常,您應該允許系統定義任務和 Activity 在概覽屏幕中的顯示方法,並且無需修改此行爲。不過,應用可以確定 Activity 在概覽屏幕中的顯示方式和時間。 您可以使用 ActivityManager.AppTask 類來管理任務,使用 Intent 類的 Activity 標誌來指定某 Activity 添加到概覽屏幕或從中移除的時間。 此外,您也可以使用 <activity> 屬性在清單文件中設置該行爲。
2 將任務添加到概覽屏幕
通過使用 Intent 類的標誌添加任務,您可以更好地控制某文檔在概覽屏幕中打開或重新打開的時間和方式。 使用 <activity> 屬性時,您可以選擇始終在新任務中打開文檔,或選擇對文檔重複使用現有任務。
2.1 使用 Intent 標誌添加任務
爲 Activity 創建新文檔時,可調用 ActivityManager.AppTask 類的 startActivity() 方法,以向其傳遞啓動 Activity 的 Intent。 要插入邏輯換行符以便系統將 Activity 視爲新任務顯示在概覽屏幕中,可在啓動 Activity 的 Intent 的 addFlags() 方法中傳遞 FLAG_ACTIVITY_NEW_DOCUMENT 標誌。
注:FLAG_ACTIVITY_NEW_DOCUMENT 標誌取代了 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 標誌,後者自 Android 5.0(API 級別 21)起已棄用。
如果在創建新文檔時設置 FLAG_ACTIVITY_MULTIPLE_TASK 標誌,則系統始終會以目標 Activity 作爲根創建新任務。此設置允許同一文檔在多個任務中打開。以下代碼演示了主 Activity 如何執行此操作:
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++;
}
}
注:使用 FLAG_ACTIVITY_NEW_DOCUMENT 標誌啓動的 Activity 必須具有在清單文件中設置的 android:launchMode="standard" 屬性值(默認)。
當主 Activity 啓動新 Activity 時,系統會搜遍現有任務,看看是否有任務的 Intent 與 Activity 的 Intent 組件名稱和 Intent 數據相匹配。 如果未找到任務或者 Intent 包含 FLAG_ACTIVITY_MULTIPLE_TASK 標誌,則會以該 Activity 作爲其根創建新任務。如果找到的話,則會將該任務轉到前臺並將新 Intent 傳遞給 onNewIntent()。新 Activity 將獲得 Intent 並在概覽屏幕中創建新文檔,如下例所示:
@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);
}
2.2 使用 Activity 屬性添加任務
此外,Activity 還可以在其清單文件中指定始終通過使用 <activity> 屬性 android:documentLaunchMode 進入新任務。 此屬性有四個值,會在用戶使用該應用打開文檔時產生以下效果:
- "intoExisting"
該 Activity 會對文檔重複使用現有任務。這與不設置 FLAG_ACTIVITY_MULTIPLE_TASK 標誌、但設置 FLAG_ACTIVITY_NEW_DOCUMENT 標誌所產生的效果相同,如上文的使用 Intent 標誌添加任務中所述。
- "always"
該 Activity 爲文檔創建新任務,即便文檔已打開也是如此。使用此值與同時設置 FLAG_ACTIVITY_NEW_DOCUMENT 和 FLAG_ACTIVITY_MULTIPLE_TASK 標誌所產生的效果相同。
- "none"
該 Activity 不會爲文檔創建新任務。概覽屏幕將按其默認方式對待此 Activity:爲應用顯示單個任務,該任務將從用戶上次調用的任意 Activity 開始繼續執行。
- "never"
該 Activity 不會爲文檔創建新任務。設置此值會替代 FLAG_ACTIVITY_NEW_DOCUMENT 和 FLAG_ACTIVITY_MULTIPLE_TASK 標誌的行爲(如果在 Intent 中設置了其中一個標誌),並且概覽屏幕將爲應用顯示單個任務,該任務將從用戶上次調用的任意 Activity 開始繼續執行。
注:對於除 none 和 never 以外的值,必須使用 launchMode="standard" 定義 Activity。如果未指定此屬性,則使用 documentLaunchMode="none"。
3 移除任務
默認情況下,在 Activity 結束後,文檔任務會從概覽屏幕中自動移除。 您可以使用 ActivityManager.AppTask 類、Intent 標誌或 <activity> 屬性替代此行爲。
通過將 <activity> 屬性 android:excludeFromRecents 設置爲 true,您可以始終將任務從概覽屏幕中完全排除。
您可以通過將 <activity> 屬性 android:maxRecents 設置爲整型值,設置應用能夠包括在概覽屏幕中的最大任務數。默認值爲 16。達到最大任務數後,最近最少使用的任務將從概覽屏幕中移除。 android:maxRecents 的最大值爲 50(內存不足的設備上爲 25);小於 1 的值無效。
3.1 使用 AppTask 類移除任務
在於概覽屏幕創建新任務的 Activity 中,您可以通過調用 finishAndRemoveTask() 方法指定何時移除該任務以及結束所有與之相關的 Activity。
public void onRemoveFromRecents(View view) {
// The document is no longer needed; remove its task.
finishAndRemoveTask();
}
注:如下所述,使用 finishAndRemoveTask() 方法代替使用 FLAG_ACTIVITY_RETAIN_IN_RECENTS 標記。
3.2 保留已完成的任務
若要將任務保留在概覽屏幕中(即使其 Activity 已完成),可在啓動 Activity 的 Intent 的 addFlags() 方法中傳遞 FLAG_ACTIVITY_RETAIN_IN_RECENTS 標誌。
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;
}
要達到同樣的效果,請將 <activity> 屬性 android:autoRemoveFromRecents 設置爲 false。文檔 Activity 的默認值爲 true,常規 Activity 的默認值爲 false。如前所述,使用此屬性替代 FLAG_ACTIVITY_RETAIN_IN_RECENTS 標誌。
文章來源:https://my.oschina.net/codestudio/blog