Màn hình Gần đây

Màn hình Gần đây (còn được gọi là màn hình Tổng quan, danh sách tác vụ gần đây hoặc màn hình ứng dụng gần đây) là giao diện người dùng cấp hệ thống liệt kê hoạt độngtác vụ đã truy cập gần đây. Người dùng có thể di chuyển qua danh sách, chọn một việc cần làm để tiếp tục hoặc xoá một việc cần làm khỏi danh sách bằng cách vuốt nó ra xa.

Màn hình Gần đây sử dụng một mô hình tập trung vào tài liệu (được giới thiệu trong Android 5.0 (API cấp 21)), trong đó nhiều thực thể của cùng một hoạt động chứa nhiều tài liệu có thể xuất hiện dưới dạng tác vụ trong màn hình Gần đây. Ví dụ: Google Drive có thể có một việc cần làm cho mỗi tài liệu trong số một số tài liệu trên Google. Mỗi tài liệu xuất hiện dưới dạng một nhiệm vụ trên màn hình Gần đây:

Màn hình Gần đây cho thấy 2 tài liệu trên Google Drive, mỗi tài liệu được trình bày dưới dạng một nhiệm vụ riêng.

Một ví dụ phổ biến khác là khi người dùng đang sử dụng trình duyệt và nhấn vào Chia sẻ > Gmail. Màn hình Soạn thư của ứng dụng Gmail xuất hiện. Khi đó, thao tác nhấn vào nút Gần đây sẽ hiển thị Chrome và Gmail đang chạy dưới dạng các tác vụ riêng biệt:

Màn hình Gần đây cho thấy Chrome và Gmail đang chạy dưới dạng các tác vụ riêng biệt.

Thường thì bạn để hệ thống xác định cách thể hiện các công việc và hoạt động của mình trên màn hình Gần đây. Bạn không cần phải sửa đổi hành vi này. Tuy nhiên, ứng dụng của bạn có thể xác định cách thức và thời điểm các hoạt động xuất hiện trên màn hình Gần đây.

Lớp ActivityManager.AppTask cho phép bạn quản lý các tác vụ và cờ hoạt động của lớp Intent cho phép bạn chỉ định thời điểm thêm hoặc xoá một hoạt động khỏi màn hình Gần đây. Ngoài ra, các thuộc tính <activity> cho phép bạn thiết lập hành vi trong tệp kê khai.

Thêm tác vụ vào màn hình Gần đây

Việc sử dụng cờ của lớp Intent để thêm một tác vụ sẽ giúp bạn kiểm soát tốt hơn thời điểm và cách thức mở hoặc mở lại một tài liệu trên màn hình Gần đây. Khi sử dụng các thuộc tính <activity>, bạn có thể chọn luôn mở tài liệu trong một tác vụ mới hoặc sử dụng lại tác vụ hiện có cho tài liệu.

Sử dụng cờ Ý định để thêm công việc

Khi tạo một tài liệu mới cho hoạt động của mình, bạn sẽ gọi phương thức startActivity(), truyền vào đó ý định dùng để chạy hoạt động. Để chèn điểm ngắt logic để hệ thống coi hoạt động của bạn là một tác vụ mới trong màn hình Gần đây, hãy truyền cờ FLAG_ACTIVITY_NEW_DOCUMENT vào phương thức addFlags() của Intent nhằm khởi chạy hoạt động đó.

Nếu bạn đặt cờ FLAG_ACTIVITY_MULTIPLE_TASK khi tạo tài liệu mới, thì hệ thống sẽ luôn tạo một tác vụ mới với hoạt động mục tiêu là hoạt động gốc. Chế độ cài đặt này cho phép mở cùng một tài liệu trong nhiều tác vụ. Mã sau đây minh hoạ cách hoạt động chính thực hiện việc này:

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;
  }

}

Khi hoạt động chính khởi chạy một hoạt động mới, hệ thống sẽ tìm kiếm một hoạt động hiện có để tìm một tác vụ có ý định khớp với tên thành phần ý định và dữ liệu ý định của hoạt động đó. Nếu không tìm thấy tác vụ hoặc ý định chứa cờ FLAG_ACTIVITY_MULTIPLE_TASK, thì một tác vụ mới sẽ được tạo với hoạt động là gốc.

Nếu tìm thấy một tác vụ có ý định khớp với tên thành phần ý định và dữ liệu ý định, hệ thống sẽ đưa tác vụ đó lên nền trước và chuyển ý định mới đến onNewIntent(). Hoạt động mới nhận ý định và tạo một tài liệu mới trong màn hình Gần đây, như trong ví dụ sau:

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);
}

Sử dụng thuộc tính hoạt động để thêm công việc

Một hoạt động cũng có thể chỉ định trong tệp kê khai rằng nó luôn chạy vào một tác vụ mới bằng cách sử dụng thuộc tính <activity> android:documentLaunchMode. Thuộc tính này có 4 giá trị tạo ra các hiệu ứng sau đây khi người dùng mở một tài liệu bằng ứng dụng:

intoExisting
Hoạt động này sử dụng lại một nhiệm vụ hiện có cho tài liệu. Việc này cũng giống như việc đặt cờ FLAG_ACTIVITY_NEW_DOCUMENTkhông đặt cờ FLAG_ACTIVITY_MULTIPLE_TASK, như mô tả trong phần Sử dụng cờ Ý định để thêm tác vụ.
always
Hoạt động tạo ra một tác vụ mới cho tài liệu, ngay cả khi tài liệu đó đã được mở. Việc sử dụng giá trị này giống như việc đặt cả hai cờ FLAG_ACTIVITY_NEW_DOCUMENTFLAG_ACTIVITY_MULTIPLE_TASK.
none
Hoạt động không tạo ra tác vụ mới cho tài liệu. Màn hình Gần đây sẽ xử lý hoạt động theo mặc định. Nó hiển thị một tác vụ duy nhất cho ứng dụng, tác vụ này sẽ tiếp tục từ bất kỳ hoạt động nào mà người dùng đã gọi gần đây nhất.
never
Hoạt động không tạo ra tác vụ mới cho tài liệu. Việc đặt giá trị này sẽ ghi đè hành vi của cờ FLAG_ACTIVITY_NEW_DOCUMENTFLAG_ACTIVITY_MULTIPLE_TASK. Nếu một trong hai thao tác này được đặt trong ý định và màn hình Gần đây hiển thị một tác vụ duy nhất cho ứng dụng, thì tác vụ đó sẽ tiếp tục hoạt động sau cùng mà người dùng đã gọi.

Xóa công việc

Theo mặc định, một tác vụ của tài liệu sẽ tự động thoát khỏi màn hình Gần đây khi hoạt động của tác vụ đó kết thúc. Bạn có thể ghi đè hành vi này bằng lớp ActivityManager.AppTask, bằng cờ Intent hoặc bằng thuộc tính <activity>.

Bạn luôn có thể loại trừ hoàn toàn một tác vụ khỏi màn hình Gần đây bằng cách đặt thuộc tính <activity> android:excludeFromRecents thành true.

Bạn có thể đặt số lượng tác vụ tối đa mà ứng dụng có thể đưa vào màn hình Gần đây bằng cách đặt thuộc tính <activity> android:maxRecents thành giá trị số nguyên. Khi đạt đến số lượng tác vụ tối đa, tác vụ được sử dụng gần đây nhất sẽ biến mất khỏi màn hình Gần đây. Giá trị mặc định là 16 và giá trị tối đa là 50 (25 trên các thiết bị có bộ nhớ thấp). Các giá trị nhỏ hơn 1 là không hợp lệ.

Sử dụng lớp AppTask để xoá các việc cần làm

Trong hoạt động tạo một tác vụ mới trên màn hình Gần đây, bạn có thể chỉ định thời điểm xoá tác vụ và hoàn tất mọi hoạt động liên kết với tác vụ đó bằng cách gọi phương thức 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();
}

Giữ lại công việc đã hoàn thành

Nếu bạn muốn giữ lại một tác vụ trên màn hình Gần đây, ngay cả khi hoạt động của tác vụ đó đã hoàn tất, hãy truyền cờ FLAG_ACTIVITY_RETAIN_IN_RECENTS vào phương thức addFlags() của ý định chạy hoạt động đó.

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;
}

Để đạt được hiệu quả tương tự, hãy đặt thuộc tính <activity> android:autoRemoveFromRecents thành false. Giá trị mặc định là true cho các hoạt động trên tài liệu và false cho các hoạt động thông thường. Việc sử dụng thuộc tính này sẽ ghi đè cờ FLAG_ACTIVITY_RETAIN_IN_RECENTS.

Bật tính năng chia sẻ URL gần đây (chỉ dành cho Pixel)

Trên các thiết bị Pixel chạy Android 12 trở lên, người dùng có thể chia sẻ đường liên kết đến nội dung web đã xem gần đây ngay từ màn hình Gần đây. Sau khi truy cập vào nội dung trong một ứng dụng, người dùng có thể vuốt đến màn hình Gần đây và tìm ứng dụng mà họ đã xem nội dung, sau đó nhấn vào nút đường liên kết để sao chép hoặc chia sẻ URL.

Màn hình Gần đây có một đường liên kết để chia sẻ nội dung trên web đã xem gần đây.

Bất kỳ ứng dụng nào cũng có thể bật tính năng liên kết Gần đây cho người dùng bằng cách cung cấp giao diện người dùng web và ghi đè onProvideAssistContent(), như trong ví dụ sau:

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"));
    }
}