Màn hình Tổng quan

Màn hình tổng quan (còn được gọi là màn hình gần đây, danh sách tác vụ gần đây, hay ứng dụng gần đây) là một UI cấp hệ thống liệt kê các hoạt độngtác vụ mới được truy cập gần đây. Người dùng có thể điều hướng qua danh sách này và chọn một tác vụ để tiếp tục, hoặc người dùng có thể loại bỏ một tác vụ khỏi danh sách bằng cách trượt nhanh nó đi. Với việc phát hành Android 5.0 (API mức 21), nhiều thực thể của hoạt động tương tự chứa các tài liệu khác nhau có thể xuất hiện dưới dạng các tác vụ trong màn hình tổng quan. Ví dụ, Google Drive có thể có một tác vụ cho từng tài liệu trong một vài tài liệu Google. Mỗi tài liệu xuất hiện thành một tác vụ trong màn hình tổng quan.

Hình 1. Màn hình tổng quan hiển thị ba tài liệu Google Drive , mỗi tài liệu được biểu diễn như một tác vụ riêng.

Thường thì bạn sẽ cho phép hệ thống định nghĩa cách tác vụ và hoạt động của mình được biểu diễn như thế nào trong màn hình tổng quan, và bạn không cần 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 gian các hoạt động xuất hiện trong màn hình tổng quan. Lớp ActivityManager.AppTask cho phép bạn quản lý tác vụ, và cờ hoạt động của lớp Intent cho phép bạn quy định khi nào thì một hoạt động được thêm hoặc loại bỏ khỏi màn hình tổng quan. Đồng thời, thuộc tính <activity> cho phép bạn đặt hành vi trong bản kê khai.

Thêm Tác vụ vào Màn hình Tổng quan

Sử dụng cờ của lớp Intent để thêm một tác vụ cho phép kiểm soát nhiều hơn đối với thời điểm và cách thức một tài liệu được mở hoặc mở lại trong màn hình tổng quan. Khi sử dụng các thuộc tính <activity> , bạn có thể chọn giữa luôn mở tài liệu trong một tác vụ mới hoặc sử dụng lại một tác vụ hiện có cho tài liệu.

Sử dụng cờ Ý định để thêm một tác vụ

Khi tạo một tài liệu mới cho hoạt động của bạn, bạn gọi phương pháp startActivity() của lớp ActivityManager.AppTask, chuyển cho nó ý định có chức năng khởi chạy hoạt động. Để chèn một ngắt lô-gic sao cho hệ thống coi hoạt động của bạn như một tác vụ mới trong màn hình tổng quan, hãy chuyển cờ FLAG_ACTIVITY_NEW_DOCUMENT trong phương pháp addFlags() của Intent có chức năng khởi chạy hoạt động.

Lưu ý: Cờ FLAG_ACTIVITY_NEW_DOCUMENT thay thế cờ FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, được rút bớt kể từ phiên bản Android 5.0 (API mức 21).

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

DocumentCentricActivity.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 = 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++;
  }
}

Lưu ý: Các hoạt động được khởi chạy bằng cờ FLAG_ACTIVITY_NEW_DOCUMENT phải có giá trị thuộc tính android:launchMode="standard" (mặc định) được đặt trong bản kê khai.

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 thông qua các tác vụ hiện tại để xem tác vụ nào có ý định khớp với tên thành phần ý định và dữ liệu Ý định cho hoạt động đó. Nếu tác vụ không được tìm thấy, hoặc ý định chứa cờ FLAG_ACTIVITY_MULTIPLE_TASK thì một tác vụ mới sẽ được tạo lấy hoạt động làm gốc. Nếu tìm thấy, nó sẽ mang tác vụ đó tới phía trước và chuyển ý định mới tới onNewIntent(). Hoạt động mới sẽ nhận ý định và tạo một tài liệu mới trong màn hình tổng quan, như trong ví dụ sau:

NewDocumentActivity.java

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

Sử dụng thuộc tính hoạt động để thêm một tác vụ

Một hoạt động cũng có thể quy định trong bản kê khai của nó rằng nó luôn khởi 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ó bốn giá trị tạo ra hiệu ứng sau khi người dùng mở một tài liệu bằng ứng dụng:

"intoExisting"
Hoạt động sử dụng lại một tác vụ hiện có cho tài liệu. Điều này giống như khi thiết đặt cờ FLAG_ACTIVITY_NEW_DOCUMENTkhông thiết đặt cờ FLAG_ACTIVITY_MULTIPLE_TASK, như được mô tả trong phần Sử dụng cờ Ý định để thêm một tác vụ bên trên.
"always"
Hoạt động tạo một tác vụ mới cho tài liệu, ngay cả khi tài liệu đã được mở. Sử dụng giá trị này giống như thiết đặt cả cờ FLAG_ACTIVITY_NEW_DOCUMENTFLAG_ACTIVITY_MULTIPLE_TASK.
"none”"
Hoạt động không tạo một tác vụ mới cho tài liệu. Màn hình tổng quan xử lý hoạt động như theo mặc định: nó hiển thị một tác vụ đơn lẻ cho ứng dụng, tác vụ này tiếp tục từ bất kỳ hoạt động nào mà người dùng đã gọi ra cuối cùng.
"never"
Hoạt động không tạo một tác vụ mới cho tài liệu. Việc thiết đặt giá trị này sẽ khống chế hành vi của FLAG_ACTIVITY_NEW_DOCUMENT và cờ FLAG_ACTIVITY_MULTIPLE_TASK, nếu một trong hai được đặt trong ý định, và màn hình tổng quan sẽ hiển thị một tác vụ đơn lẻ cho ứng dụng, tác vụ này tiếp tục từ bất kỳ hoạt động nào mà người dùng đã gọi ra cuối cùng.

Lưu ý: Đối với những giá trị ngoài nonenever hoạt động phải được định nghĩa bằng launchMode="standard". Nếu thuộc tính này không được quy định thì documentLaunchMode="none" sẽ được sử dụng.

Loại bỏ Tác vụ

Theo mặc định, một tác vụ tài liệu sẽ tự động được loại bỏ khỏi màn hình tổng quan khi hoạt động của nó hoàn thành. Bạn có thể khống chế hành vi này bằng lớp ActivityManager.AppTask, bằng một cờ Intent, hoặc bằng một thuộc tính <activity>.

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

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

Sử dụng lớp AppTask để loại bỏ tác vụ

Trong hoạt động mà tạo một tác vụ mới trong màn hình tổng quan, bạn có thể quy định khi nào thì loại bỏ tác vụ và hoàn thành tất cả các hoạt động gắn liền với nó bằng cách gọi phương pháp finishAndRemoveTask().

NewDocumentActivity.java

public void onRemoveFromRecents(View view) {
    // The document is no longer needed; remove its task.
    finishAndRemoveTask();
}

Lưu ý: Sử dụng phương pháp finishAndRemoveTask() sẽ khống chế việc sử dụng tag FLAG_ACTIVITY_RETAIN_IN_RECENTS, như được trình bày ở bên dưới.

Giữ lại tác vụ đã hoàn thành

Nếu bạn muốn giữ lại một tác vụ trong màn hình tổng quan, ngay cả khi hoạt động của nó đã hoàn thành, hãy chuyển cờ FLAG_ACTIVITY_RETAIN_IN_RECENTS trong phương pháp addFlags() của Ý định mà khởi chạy hoạt động.

DocumentCentricActivity.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, incrementAndGet());
    return newDocumentIntent;
}

Để đạt được cùng kết quả như vậy, hãy đặt thuộc tính <activity> android:autoRemoveFromRecents thành false. Giá trị mặc định bằng true đối với các hoạt động tài liệu, và false đối với các hoạt động thông thường. Việc sử dụng thuộc tính này sẽ khống chế cờ FLAG_ACTIVITY_RETAIN_IN_RECENTS, như đã trình bày trước đó.