Android Overview Screen
Màn hình tổng quan (Overview Screen) - (cũng được gọi là recents screen , recent task list , or recent apps ) là một giao diện hệ thống (system-level UI) liệt kê các hoạt động (activities) và nhiệm vụ (tasks) mới truy cập. Người dùng có thể điều hướng thông qua danh sách được liệt kê ra và lựa ...
Màn hình tổng quan (Overview Screen) - (cũng được gọi là recents screen, recent task list, or recent apps) là một giao diện hệ thống (system-level UI) liệt kê các hoạt động (activities) và nhiệm vụ (tasks) mới truy cập. Người dùng có thể điều hướng thông qua danh sách được liệt kê ra và lựa chọn 1 tác vụ để tiếp tục, hoặc có thể loại bọ 1 tác vụ từ danh sách đó.
Cùng với sự phát hành của Android 5.0 (API 21), nhiều thể hiện của cùng một màn hình chứa đựng các tài liệu khác nhau có thể được hiển thị như một nhiệm vụ (task) trong màn hình tổng quan. Cho Ví dụ: Google Drive có 1 nhiệm vụ cho việc hiển thị một vài tài liệu của Google Documents như hình dưới
Hình 1. Màn hình hiển thị tổng quan ba tài liệu Google Drive, từng biểu diễn như là một nhiệm vụ riêng biệt.
Thông thường, bạn nên cho phép hệ thống xác định làm cách nào các nhiệm vụ (Task) và các hoạt động (Activity) của bạn là được hiển thị trong màn hình tổng quan và bạn không cần thay đổi hành vi này. Tuy nhiên, ứng dụng có bạn có thể xác định làm cách nào và khi nào các hoạt động của bạn xuất hiện trong màn hình tổng quan.
Lớp ActivityManager.AppTask cho phép bạn quản lý các nhiệm vụ, và thêm vào 1 flag của lớp Intent mà bạn chỉ định khi một activity được thêm vào hoặc loại bỏ từ màn hình tổng quan. Ngoài ra, thuộc tính của thẻ <Acitivty> cho phép bạn điều hướng hành vi trong AndroidManifest.xml.
Thêm nhiệm vụ vào màn hình tổng quan
Sử dụng flags của Intent thêm vào 1 nhiệm vụ để kiểm soát tốt hơn việc 1 tài liệu được mở mới hoặc mở lại trong màn hình tổng quan. Khi bạn sử dụng thuộc tính <acitivty> bạn có thể lựa chọn giữa việc luôn luôn tạo ra 1 thể hiện mới của nhiệm vụ hoặc mở lại nhiệm vụ đã tồn tại.
(Một item trong màn hình tổngq quan được gọi là 1 tài liệu (document))
Sử dụng Intent flag để thêm vào 1 nhiệm vụ
Khi bạn tạo ra 1 nhiệm vụ mới cho màn hình của bạn, bạn gọi phương thức startActivity() của lớp ActivityManager.AppTask, đưa vào nó 1 Intent để bắt đầu hoạt động đó. Để chèn vào một logic hợp lý cho hệ thống xử lý hoạt động của bạn như 1 nhiệm vụ mới trong màn hình tổng quan, đưa vào flag FLAG_ACTIVITY_NEW_DOCUMENT trong phương thức addFlag() của lớp Intent để mở hoạt của bạn.
Chú ý: Trong Android 5.0 (API 21) Flag FLAG_ACTIVITY_NEW_DOCUMENT thay thế cho flag FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET.
Nếu bạn gán fag FLAG_ACTIVITY_MULTIPLE_TASK khi bạn tạo một tài liệu (document) mới, hệ thống luôn luôn tạo ra 1 nhiệm vụ với activity mục tiêu như là root activity. Cài đặt này cho phép cùng một tài liệu có thể được mở ra ở nhiều nhiệm vụ khác nhau. Mã nguồn sau minh họa cách 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++; } }
Chú ý: Các hoạt động có cờ FLAG_ACTIVITY_NEW_DOCUMENT phải mặc định có thuộc tính android:launchMode="standard" trong <activity> đặt trong AndroidManifest.
Khi hoạt động chính đưa ra một hoạt động mới, hệ thống tìm kiếm qua các nhiệm vụ hiện tại, một intent khớp với Intent có các thành phần tên và dữ liệu cho activity đó. Nếu nhiệm vụ không tìm thấy hoặc intent chứa đựng cờ FLAG_ACTIVITY_MULTIPLE_TASK, một nhiệm vụ mới sẽ được tạo ra như là gốc các hoạt động. Nếu nó tìm thấy một nhiệm vụ trùng khớp, nó đẩy nhiệm vụ đó tới phía trước và đưa intent mới vào phương thức onNewIntent()(http://developer.android.com/reference/android/app/Activity.html#onNewIntent(android.content.Intent)). Hoạt động mới lấy được intent và tạo một tài liệu mới trong màn hình tổng quan, xem ví dụ dưới đây:
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 các thuộc tính của Activity để thêm 1 task
Một hoạt động cũng có thể chỉ định trong Manifest luôn luôn khởi chạy như 1 nhiệm vụ mới bằng cách sử dụng thuộc tính android:documentLaunchMode trong thẻ <activity>. Thuộc tính này có 4 giá trị với các tác dụng để sử dụng cho việc mở một tài liệu:
**"intoExisting" **
Sử dụng điều này các hoạt động sẽ tái sử dụng một nhiệm vụ hiện có cho document. Điều này là tương tự với việc cài đặt flag FLAG_ACTIVITY_NEW_DOCUMENT mà k cài đặt flag FLAG_ACTIVITY_MULTIPLE_TASK, như mô tả ở phía trên.
"always"
Điều này luôn luôn tại ra một nhiệm vụ mới cho document ngay cả khi tài liệu đó đang được mở. Sử dụng giá trị này giống với việc sử dụng cả 2 flag FLAG_ACTIVITY_NEW_DOCUMENT và FLAG_ACTIVITY_MULTIPLE_TASK.
"none"
Sử dụng điều này hoạt động sẽ không tạo ra 1 nhiệm vụ mới cho document. Màn hình tổng quan sẽ đối xử với activity này theo mặc định: Nó sẽ hiển thị một nhiệm vụ duy nhất cho hoạt động cuối cùng trong app app.
"never"
Sử dụng điều này hoạt động sẽ không tạo ra 1 nhiệm vụ mới cho document. Cài đặt giá trị này sẽ ghi đè hành vi của flag FLAG_ACTIVITY_NEW_DOCUMENT và FLAG_ACTIVITY_MULTIPLE_TASK, khiến cho chúng k còn tác dụng sau đó màn hình tổng quan sẽ hiện thị duy nhất một nhiệm vụ như cách hiển thị khi sử dụng giá trị "none" phía trên.
Chú ý: Đối với việc cài đặt giá trị “none” và “nerver” thẻ acvitity phải được gán launchMode="standard". Nếu thuộc tính này không được chỉ định, mặc định documentLaunchMode="none" đựợc sử dụng.
Loại bỏ các nhiệm vụ trong màn hình tổng quan
Theo mặc định một task của tài liệu được tự động loại bỏ từ màn hình tổng quan khi các hoạt động của nó kết thúc. Bạn có thể thay đổi hành vi này với lớp ActivityManager.AppTask với một flag trong Intent hoặc một thuộc tính của thẻ <activity>.
Bạn luôn luôn có thể loại bỏ một nhiệm vụ khỏi màn hình tổng quan bằng cách thiết lập thuộc tính cho thẻ <activity>: android:excludeFromRecents bằng true.
Bạn có thể thiết lập số lượng tối đa các nhiệm vụ mà ứng dụng của bạn thêm vào màn hình tổng quan bằng việc cài đặt thuộc tính android:maxRecents trong thẻ <activity> với 1 số nguyên nào đó. Theo mặt định là 16.
Khi số lượng tối đa nhiệm vụ được đạt tới, nhiệm vụ sử dụng gần đây nhất được loại bỏ khỏi màn hình tổng quan. Số lượng tối đa gán cho thuộc tính android:maxRecents là 50 (25 cho thiết bị có bộ nhớ thấp); giá trị nhỏ hơn 1 là không hợp lệ.
Sử dụng lớp AppTask để xóa bỏ các nhiệm vụ
Trong activity tạo ra một nhiệm vụ mới trong màn hình tổng quan, bạn có thể mô tả khi nào các nhiệm vụ được loại bỏ và hoàn thành tất cả các hoạt động liên kết (activity associcated) bằng việc gọi phương thức 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 thức finishAndRemoveTask () ghi đè việc sử dụng các flag FLAG_ACTIVITY_RETAIN_IN_RECENTS, được thảo luận dưới đây.
Giữ lại các nhiệm vụ đã hòan thành
Nếu bạn muốn giữ lại một nhiệm vụ trong màn hình tổng quan, ngay cả khi hoạt động đó đã hoàn thành (finished), đưa vào phương thức addFlags() cờ FLAG_ACTIVITY_RETAIN_IN_RECENTS trong intent.
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 hiệu quả tương tự, thiết lập thuộc tính android:autoRemoveFromRecents trong thẻ <acitivty> tới false. Mặc định giá trị là true cho hoạt động thông thường, là false cho các tài liệu được sử dụng thường xuyên. Sử dụng thuộc tính này ghi đè lên cờ FLAG_ACTIVITY_RETAIN_IN_RECENTS, thảo luận trước đó.
Tham khảo: http://developer.android.com/guide/components/recents.html