文章照搬過來的:原文地址https://developer.android.google.cn/guide/components/recents.html 概覽屏幕(也稱為最新動態屏幕、最近任務列表或最近使用的應用)是一個系統級別 UI,其中列出了最近訪問過的 Activity 和任務。 用戶可以瀏 ...
文章照搬過來的:原文地址https://developer.android.google.cn/guide/components/recents.html
概覽屏幕(也稱為最新動態屏幕、最近任務列表或最近使用的應用)是一個系統級別 UI,其中列出了最近訪問過的 Activity 和任務。 用戶可以瀏覽該列表並選擇要恢復的任務,也可以通過滑動清除任務將其從列表中移除。 對於 Android 5.0 版本(API 級別 21),包含不同文檔的同一 Activity 的多個實例可能會以任務的形式顯示在概覽屏幕中。 例如,Google Drive 可能對多個 Google 文檔中的每個文檔均執行一個任務。 每個文檔均以任務的形式顯示在概覽屏幕中。
通常,您應該允許系統定義任務和 Activity 在概覽屏幕中的顯示方法,並且無需修改此行為。不過,應用可以確定 Activity 在概覽屏幕中的顯示方式和時間。 您可以使用 ActivityManager.AppTask
類來管理任務,使用 Intent
類的 Activity 標誌來指定某 Activity 添加到概覽屏幕或從中移除的時間。 此外,您也可以使用 <activity>
屬性在清單文件中設置該行為。
將任務添加到概覽屏幕
通過使用 Intent
類的標誌添加任務,您可以更好地控制某文檔在概覽屏幕中打開或重新打開的時間和方式。 使用 <activity>
屬性時,您可以選擇始終在新任務中打開文檔,或選擇對文檔重覆使用現有任務。
使用 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);
}
使用 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"
。
移除任務
預設情況下,在 Activity 結束後,文檔任務會從概覽屏幕中自動移除。 您可以使用 ActivityManager.AppTask
類、Intent
標誌或 <activity>
屬性替代此行為。
通過將 <activity>
屬性 android:excludeFromRecents
設置為 true
,您可以始終將任務從概覽屏幕中完全排除。
您可以通過將 <activity>
屬性 android:maxRecents
設置為整型值,設置應用能夠包括在概覽屏幕中的最大任務數。預設值為 16。達到最大任務數後,最近最少使用的任務將從概覽屏幕中移除。 android:maxRecents
的最大值為 50(記憶體不足的設備上為 25);小於 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
標記。
保留已完成的任務
若要將任務保留在概覽屏幕中(即使其 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
標誌。