Màn hình Gần đây, còn được gọi là màn hình Overview (Tổng quan), công việc gần đây list (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ê các ứng dụng đã truy cập gần đây hoạt động và công việc. Người dùng có thể di chuyển qua danh sách, chọn một tác vụ để tiếp tục hoặc xoá một công việc khỏi danh sách bằng cách vuốt công việc sang bên.
Màn hình Gần đây sử dụng giao diện tập trung vào tài liệu mô hình—được giới thiệu trong Android 5.0 (API cấp 21), trong đó nhiều phiên bản của cùng một hoạt động chứa các tài liệu khác nhau có thể xuất hiện dưới dạng công việc trong Màn hình Gần đây. Ví dụ: Google Drive có thể có một tác vụ cho từng một số tài liệu Google. Mỗi tài liệu sẽ xuất hiện dưới dạng một nhiệm vụ trong trang Gần đây màn hình:
Một ví dụ phổ biến khác là khi người dùng đang sử dụng trình duyệt và họ nhấn vào Chia sẻ > Gmail. Màn hình Soạn thư của ứng dụng Gmail xuất hiện. Nhấn vào Tại thời điểm đó, nút Gần đây cho thấy Chrome và Gmail hoạt động dưới dạng các hoạt động riêng biệt nhiệm vụ:
Thông thường, bạn để hệ thống xác định các nhiệm vụ và hoạt động của bạn được thể hiện trên màn hình Gần đây. Bạn không cần sửa đổi chế độ này hành vi. 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 trong Màn hình Gần đây.
Chiến lược phát hành đĩa đơn
ActivityManager.AppTask
cho phép bạn quản lý các tác vụ và cờ hoạt động của
Intent
cho phép bạn chỉ định thời điểm
hoạt động sẽ được thêm hoặc bị xoá khỏi màn hình Gần đây. Ngoài ra,
Thuộc tính <activity>
cho phép bạn đặt
hành vi trong tệp kê khai.
Thêm việc cần làm vào màn hình Gần đây
Sử dụng cờ của lớp Intent
để
tính năng thêm nhiệm vụ giúp bạn kiểm soát tốt hơn thời điểm và cách thức mở tài liệu, hoặc
đã mở lại trong màn hình Gần đây. Khi bạn sử dụng
<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ài liệu hiện có
công việc cho tài liệu.
Sử dụng cờ Ý định để thêm một 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 gọi hàm
startActivity()
phương thức, truyền vào đó ý định khởi chạy hoạt động. Để chèn một hàm logic
ngắt để hệ thống coi hoạt động của bạn là một tác vụ mới trong danh sách Gần đây
hãy truyền
FLAG_ACTIVITY_NEW_DOCUMENT
gắn cờ trong addFlags()
của Intent
để khởi chạy
của bạn.
Nếu bạn đặt FLAG_ACTIVITY_MULTIPLE_TASK
gắn cờ khi bạn tạo tài liệu mới, hệ thống sẽ luôn tạo tác vụ mới bằng
hoạt động mục tiêu làm gốc. Cài đặt này cho phép cùng một tài liệu
đã mở trong nhiều tác vụ. Mã sau đây minh hoạ cách
hoạt động sẽ 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
các tác vụ hiện có cho một tác vụ có ý định khớp với tên thành phần ý định và
dữ liệu ý định cho hoạt động. Nếu không tìm thấy tác vụ hoặc ý định có chứa ý định
FLAG_ACTIVITY_MULTIPLE_TASK
cờ, một tác vụ mới sẽ được tạo với hoạt động là hoạt động gốc.
Nếu hệ thống 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, nó sẽ đưa tác vụ đó lên trước và truyề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 ứng dụng 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 một việc cần làm
Một hoạt động cũng có thể chỉ định trong tệp kê khai rằng hoạt động đó luôn khởi chạy trong một
công việc bằng cách sử dụng <activity>
android:documentLaunchMode
.
Thuộc tính này có bốn giá trị tạo ra các hiệu ứng sau đây khi người dùng
mở một tài liệu có ứ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. Việc này cũng giống như đặt
FLAG_ACTIVITY_NEW_DOCUMENT
gắn cờ mà không đặt giá trịFLAG_ACTIVITY_MULTIPLE_TASK
như được mô tả trong Sử dụng cờ Ý định để thêm một phần công việc. 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
đã mở. Việc sử dụng giá trị này cũng giống như đặt cả
Cờ
FLAG_ACTIVITY_NEW_DOCUMENT
vàFLAG_ACTIVITY_MULTIPLE_TASK
. none
- Hoạt động không tạo ra tác vụ mới cho tài liệu. Danh sách "Gần đây" màn hình sẽ xử lý hoạt động theo mặc định. Mục này cho thấy một nhiệm vụ duy nhất cho ứng dụng, sẽ tiếp tục từ bất kỳ hoạt động nào mà người dùng đã gọi sau cùng.
never
- Hoạt động không tạo ra tác vụ mới cho tài liệu. Đặt giá trị này
ghi đè hành vi của
FLAG_ACTIVITY_NEW_DOCUMENT
vàFLAG_ACTIVITY_MULTIPLE_TASK
cờ. Nếu một trong hai yếu tố 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, nó sẽ tiếp tục từ bất kỳ hoạt động nào người dùng đã gọi gần đây nhất.
Xóa công việc
Theo mặc định, một tác vụ tài liệu sẽ tự động thoát khỏi màn hình Gần đây
khi hoạt động của ứng dụng kết thúc. Bạn có thể ghi đè hành vi này bằng
ActivityManager.AppTask
có cờ Intent
hoặc
thuộc tính <activity>
.
Bạn luôn có thể loại trừ hoàn toàn một công việc khỏi màn hình Gần đây bằng cách đặt
thuộc tính <activity>
android:excludeFromRecents
đến true
.
Bạn có thể đặt số lượng công việc 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
với một
giá trị số nguyên. Khi đạt đến số lượng công việc tối đa,
tác vụ được 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 thiết bị có bộ nhớ thấp). Thấp hơn giá trị
lớn hơn 1 là không hợp lệ.
Sử dụng lớp AppTask để xoá các công việc
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 xóa tác vụ và kết thúc tất cả hoạt động được liên kết với tác vụ đó
đang gọi
finishAndRemoveTask()
phương thức:
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 những việc cần làm đã hoàn thành
Nếu bạn muốn giữ lại một công việc trên màn hình Gần đây, ngay cả khi hoạt động của công việc đó đã
đã hoàn tất, hãy chuyển
FLAG_ACTIVITY_RETAIN_IN_RECENTS
gắn cờ trong
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
đến 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 xuyên. 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 vào nội dung bạn đã xem gần đây ngay trên màn hình Gần đây. Sau khi truy cập 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 để tìm ứng dụng nơi họ xem nội dung, sau đó nhấn vào nút liên kết để sao chép hoặc chia sẻ URL.
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 một 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")); } }