最近的畫面

「最近使用」畫面又稱為「總覽」畫面、近期工作清單或最近存取的應用程式畫面,是系統層級的 UI,會列出最近存取的活動工作。使用者可以瀏覽清單、選取要重新啟用的工作,或將任務從清單中移除。

「最近使用」畫面採用「以文件為主的模型」,也就是 Android 5.0 (API 級別 21) 中引入。在該模型中,含有不同文件的同一活動的多個執行個體,可能會顯示為「最近使用」畫面中的工作。舉例來說,Google 雲端硬碟可能會為每份文件建立一項工作。在「最近使用」畫面中,每份文件都會顯示為工作:

「近期使用」畫面顯示兩份 Google 雲端硬碟文件,其中分別以獨立工作表示。

另一個常見的例子是,使用者使用瀏覽器,並且依序輕觸「分享」 >「Gmail」。Gmail 應用程式的「撰寫」畫面會隨即顯示。這時輕觸「最近使用」按鈕,就會顯示 Chrome 和 Gmail 做為個別工作執行:

「最近使用」畫面顯示 Chrome 和 Gmail 做為獨立工作執行。

一般來說,您可讓系統定義工作和活動在「最近使用」畫面中呈現的方式。您不需要修改這個行為。不過,您的應用程式可以決定活動在「最近使用」畫面中顯示的方式和時間。

ActivityManager.AppTask 類別可讓您管理工作,而 Intent 類別的活動旗標可讓您指定何時新增或移除活動。此外,<activity> 屬性可讓您在資訊清單中設定行為。

將工作新增至「最近」畫面

您可以利用 Intent 類別的標記來新增工作,藉此在「最近使用」畫面中,進一步控製文件開啟或重新開啟的時間和方式。使用 <activity> 屬性時,您可以選擇一律在新工作中開啟文件,或重複使用文件的現有工作。

使用 Intent 旗標新增工作

為活動建立新文件時,您可以呼叫 startActivity() 方法,並傳遞至啟動活動的意圖。如要插入邏輯中斷情形,讓系統在「最近使用」畫面中將活動視為新任務,請在啟動活動的 IntentaddFlags() 方法中傳遞 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_DOCUMENTFLAG_ACTIVITY_MULTIPLE_TASK 旗標的效果相同。
none
活動不會為文件建立新任務。「最近」畫面會按照預設將活動處理。此模式會為應用程式顯示單一工作,並從使用者上次叫用的任意活動繼續執行。
never
活動不會為文件建立新任務。設定這個值會覆寫 FLAG_ACTIVITY_NEW_DOCUMENTFLAG_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"));
    }
}