「最近使用」畫面又稱為「總覽」畫面、近期工作清單或最近存取的應用程式畫面,是系統層級的 UI,會列出最近存取的活動和工作。使用者可以瀏覽清單、選取要重新啟用的工作,或將任務從清單中移除。
「最近使用」畫面採用「以文件為主的模型」,也就是 Android 5.0 (API 級別 21) 中引入。在該模型中,含有不同文件的同一活動的多個執行個體,可能會顯示為「最近使用」畫面中的工作。舉例來說,Google 雲端硬碟可能會為每份文件建立一項工作。在「最近使用」畫面中,每份文件都會顯示為工作:
另一個常見的例子是,使用者使用瀏覽器,並且依序輕觸「分享」 >「Gmail」。Gmail 應用程式的「撰寫」畫面會隨即顯示。這時輕觸「最近使用」按鈕,就會顯示 Chrome 和 Gmail 做為個別工作執行:
一般來說,您可讓系統定義工作和活動在「最近使用」畫面中呈現的方式。您不需要修改這個行為。不過,您的應用程式可以決定活動在「最近使用」畫面中顯示的方式和時間。
ActivityManager.AppTask
類別可讓您管理工作,而 Intent
類別的活動旗標可讓您指定何時新增或移除活動。此外,<activity>
屬性可讓您在資訊清單中設定行為。
將工作新增至「最近」畫面
您可以利用 Intent
類別的標記來新增工作,藉此在「最近使用」畫面中,進一步控製文件開啟或重新開啟的時間和方式。使用 <activity>
屬性時,您可以選擇一律在新工作中開啟文件,或重複使用文件的現有工作。
使用 Intent 旗標新增工作
為活動建立新文件時,您可以呼叫 startActivity()
方法,並傳遞至啟動活動的意圖。如要插入邏輯中斷情形,讓系統在「最近使用」畫面中將活動視為新任務,請在啟動活動的 Intent
的 addFlags()
方法中傳遞 FLAG_ACTIVITY_NEW_DOCUMENT
標記。
如果您在建立新文件時設定了 FLAG_ACTIVITY_MULTIPLE_TASK
旗標,系統一律會建立新任務,並將目標活動做為根層級。這項設定可讓使用者在多個工作中開啟同一份文件。以下程式碼示範主要活動如何執行這項作業:
Kotlin
fun createNewDocument(view: View) { val newDocumentIntent = newDocumentIntent() if (useMultipleTasks) { newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK) } startActivity(newDocumentIntent) } private fun newDocumentIntent(): Intent = Intent(this, NewDocumentActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT or android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS) putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, documentCounter++) }
Java
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 = checkbox.isChecked(); final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class); newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, documentCounter++); return newDocumentIntent; } }
當主要活動啟動新活動時,系統會搜尋現有任務,找出意圖與意圖元件名稱和活動的意圖資料相符的工作。如果找不到任務,或意圖包含 FLAG_ACTIVITY_MULTIPLE_TASK
旗標,系統就會建立新任務,並以活動做為根層級。
如果系統找到的意圖與意圖元件名稱和意圖資料相符,就會將該任務移到前景,並將新意圖傳遞至 onNewIntent()
。新活動會取得意圖,並在「最近使用」畫面中建立新文件,如以下範例所示:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_new_document) documentCount = intent .getIntExtra(DocumentCentricActivity.KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0) documentCounterTextView = findViewById(R.id.hello_new_document_text_view) setDocumentCounterText(R.string.hello_new_document_counter) } override fun onNewIntent(newIntent: Intent) { super.onNewIntent(newIntent) /* If FLAG_ACTIVITY_MULTIPLE_TASK has not been used, this Activity will be reused. */ setDocumentCounterText(R.string.reusing_document_counter) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_new_document); documentCount = getIntent() .getIntExtra(DocumentCentricActivity.KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0); documentCounterTextView = (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>
屬性 android:documentLaunchMode
,在資訊清單中指定一律啟動為新的任務。這個屬性有四個值,當使用者透過應用程式開啟文件時,會產生以下效果:
intoExisting
- 活動會重複使用文件現有的工作。這與設定
FLAG_ACTIVITY_NEW_DOCUMENT
標記相同,但不必設定FLAG_ACTIVITY_MULTIPLE_TASK
旗標,詳情請參閱「使用意圖旗標新增工作」一節。 always
- 即使文件已經開啟,活動仍會為文件建立新的任務。使用這個值與同時設定
FLAG_ACTIVITY_NEW_DOCUMENT
和FLAG_ACTIVITY_MULTIPLE_TASK
旗標的效果相同。 none
- 活動不會為文件建立新任務。「最近」畫面會按照預設將活動處理。此模式會為應用程式顯示單一工作,並從使用者上次叫用的任意活動繼續執行。
never
- 活動不會為文件建立新任務。設定這個值會覆寫
FLAG_ACTIVITY_NEW_DOCUMENT
和FLAG_ACTIVITY_MULTIPLE_TASK
標記的行為。如果意圖中設定了這些屬性,且「最近使用」畫面顯示應用程式的單一任務,就會從使用者上次叫用的任意活動繼續執行。
移除工作
根據預設,文件工作會在活動結束後自動從「最近使用」畫面結束。您可以���用 ActivityManager.AppTask
類別、Intent
標記或 <activity>
屬性覆寫這個行為。
您隨時可以將 <activity>
屬性 android:excludeFromRecents
設為 true
,藉此從「最近使用」畫面完全排除任務。
只要將 <activity>
屬性 android:maxRecents
設為整數值,即可設定應用程式可在「最近使用」畫面中包含的工作數量上限。達到任務數量上限時,最近使用的工作數就會從「最近使用」畫面中消失。預設值為 16,最大值為 50 (低記憶體裝置為 25)。小於 1 的值無效。
使用 AppTask 類別移除工作
在「最近使用」畫面中建立新任務的活動中,您可以呼叫 finishAndRemoveTask()
方法,指定移除任務的時間,並完成所有與工作相關的活動:
Kotlin
fun onRemoveFromOverview(view: View) { // It is good pratice to remove a document from the overview stack if not needed anymore. finishAndRemoveTask() }
Java
public void onRemoveFromRecents(View view) { // The document is no longer needed; remove its task. finishAndRemoveTask(); }
保留已完成的工作
如果您想在「最近使用」畫面中保留某項任務 (即使該任務活動已完成),請在啟動活動的意圖的 addFlags()
方法中傳遞 FLAG_ACTIVITY_RETAIN_IN_RECENTS
標記。
Kotlin
private fun newDocumentIntent() = Intent(this, NewDocumentActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT or android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS) putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, getAndIncrement()) }
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, getAndIncrement()); return newDocumentIntent; }
如要達到相同效果,請將 <activity>
屬性 android:autoRemoveFromRecents
設為 false
。文件活動的預設值為 true
,一般活動的預設值為 false
。使用這個屬性會覆寫 FLAG_ACTIVITY_RETAIN_IN_RECENTS
標記。
啟用近期網址分享功能 (僅限 Pixel)
在搭載 Android 12 以上版本的 Pixel 裝置上,使用者可以直接從「最近使用」畫面分享最近瀏覽的網頁內容連結。使用者造訪應用程式內容後,可以滑動至「最近使用」畫面,找出先前查看內容的應用程式,然後輕觸連結按鈕,即可複製或分享網址。
所有應用程式都可以提供網頁 UI 並覆寫 onProvideAssistContent()
,為使用者啟用「最近」連結,如以下範例所示:
Kotlin
class MainActivity : AppCompatActivity() { protected fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } fun onProvideAssistContent(outContent: AssistContent) { super.onProvideAssistContent(outContent) outContent.setWebUri(Uri.parse("https://example.com/myCurrentPage")) } }
Java
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void onProvideAssistContent(AssistContent outContent) { super.onProvideAssistContent(outContent); outContent.setWebUri(Uri.parse("https://example.com/myCurrentPage")); } }