Tác vụ và ngăn xếp lui

Nhiệm vụ là tập hợp các hoạt động mà người dùng tương tác khi cố gắng làm điều gì đó trong ứng dụng của bạn. Các hoạt động này được sắp xếp trong một ngăn xếp gọi là ngăn xếp lui theo thứ tự mở từng hoạt động.

Ví dụ: một ứng dụng email có thể có một hoạt động để hiển thị danh sách thư mới. Khi người dùng chọn một tin nhắn, một hoạt động mới sẽ mở ra để xem tin nhắn đó. Hoạt động mới này được thêm vào ngăn xếp lui. Sau đó, khi người dùng nhấn hoặc vuốt để Quay lại, hoạt động mới đó sẽ kết thúc và bị đẩy ra khỏi ngăn xếp.

Vòng đời của một tác vụ và ngăn xếp lui của tác vụ đó

Màn hình chính của thiết bị là nơi bắt đầu cho hầu hết các tác vụ. Khi người dùng nhấn vào biểu tượng của một ứng dụng hoặc lối tắt trong trình chạy ứng dụng hoặc trên màn hình chính, tác vụ của ứng dụng đó sẽ xuất hiện trên nền trước. Nếu không có nhiệm vụ nào cho ứng dụng, thì một nhiệm vụ mới sẽ được tạo và hoạt động chính cho ứng dụng đó sẽ mở dưới dạng hoạt động gốc trong ngăn xếp.

Khi hoạt động hiện tại bắt đầu một hoạt động khác, hoạt động mới sẽ được đẩy lên đầu ngăn xếp và được lấy tiêu điểm. Hoạt động trước đó vẫn nằm trong ngăn xếp nhưng đã bị dừng. Khi một hoạt động bị dừng, hệ thống sẽ giữ lại trạng thái hiện tại của giao diện người dùng. Khi người dùng thực hiện thao tác quay lại, hoạt động hiện tại sẽ được đẩy ra khỏi đầu ngăn xếp và bị huỷ. Hoạt động trước đó sẽ tiếp tục và trạng thái trước đó của giao diện người dùng sẽ được khôi phục.

Các hoạt động trong ngăn xếp không bao giờ được sắp xếp lại, chỉ được đẩy khi bắt đầu và bật lên khi bị loại bỏ bằng nút quay lại hoặc cử chỉ. Do đó, ngăn xếp lui hoạt động như một cấu trúc vào sau, ra trước, như minh hoạ trong hình 1.

Hình 1. Hình minh hoạ cách mỗi hoạt động mới trong một tác vụ thêm một mục vào ngăn xếp lui. Khi người dùng nhấn hoặc vuốt để Quay lại, hoạt động hiện tại sẽ bị huỷ và hoạt động trước đó sẽ tiếp tục.

Khi người dùng tiếp tục nhấn hoặc thực hiện cử chỉ Quay lại, mỗi hoạt động trong ngăn xếp sẽ được bật lên để hiển thị hoạt động trước đó, cho đến khi người dùng quay lại Màn hình chính hoặc quay lại bất kỳ hoạt động nào đang chạy khi tác vụ bắt đầu. Khi tất cả hoạt động bị xoá khỏi ngăn xếp, tác vụ sẽ không còn tồn tại.

Hành vi nhấn vào nút quay lại đối với các hoạt động trong trình chạy gốc

Hoạt động của trình chạy gốc là những hoạt động khai báo bộ lọc ý định bằng cả ACTION_MAIN và CATEGORY_LAUNCHER. Các hoạt động này là duy nhất vì chúng đóng vai trò là điểm truy cập vào ứng dụng của bạn từ trình chạy ứng dụng và được dùng để bắt đầu một tác vụ.

Khi người dùng nhấn hoặc thực hiện cử chỉ Quay lại từ một hoạt động của trình chạy gốc, hệ thống sẽ xử lý sự kiện theo cách khác nhau tuỳ thuộc vào phiên bản Android mà thiết bị đang chạy.

Hành vi của hệ thống trên Android 11 trở xuống
Hệ thống hoàn tất hoạt động.
Hành vi của hệ thống trên Android 12 trở lên

Hệ thống sẽ di chuyển hoạt động và tác vụ của hoạt động đó xuống nền thay vì kết thúc hoạt động. Hành vi này khớp với hành vi mặc định của hệ thống khi thoát khỏi một ứng dụng bằng nút hoặc cử chỉ Màn hình chính.

Trong hầu hết trường hợp, hành vi này có nghĩa là người dùng có thể tiếp tục sử dụng ứng dụng của bạn nhanh hơn từ trạng thái ấm, thay vì phải khởi động lại hoàn toàn ứng dụng từ trạng thái nguội.

Nếu cần cung cấp điều hướng quay lại tuỳ chỉnh, bạn nên sử dụng AndroidX Activity API thay vì ghi đè onBackPressed(). API Hoạt động AndroidX tự động tuân theo hành vi thích hợp của hệ thống nếu không có thành phần nào chặn thao tác nhấn vào nút Quay lại của hệ thống.

Tuy nhiên, nếu ứng dụng của bạn ghi đè onBackPressed() để xử lý thao tác Quay lại và hoàn tất hoạt động, hãy cập nhật phương thức triển khai để gọi đến super.onBackPressed() thay vì hoàn tất. Việc gọi super.onBackPressed() sẽ di chuyển hoạt động và tác vụ của hoạt động đó xuống nền khi thích hợp, đồng thời mang lại trải nghiệm điều hướng nhất quán hơn cho người dùng trên các ứng dụng.

Tác vụ ở chế độ nền và nền trước

Hình 2. Hai tác vụ: Tác vụ B nhận được hoạt động tương tác của người dùng ở nền trước, trong khi Tác vụ A ở chế độ nền, chờ tiếp tục.

Tác vụ là một đơn vị gắn kết có thể chuyển sang nền khi người dùng bắt đầu một tác vụ mới hoặc chuyển đến Màn hình chính. Khi ở chế độ nền, tất cả hoạt động trong tác vụ đều bị dừng, nhưng ngăn xếp lui cho tác vụ vẫn còn nguyên vẹn – tác vụ mất tiêu điểm trong khi một tác vụ khác diễn ra, như minh hoạ trong hình 2. Sau đó, một tác vụ có thể quay lại nền trước để người dùng có thể tiếp tục từ nơi họ đã dừng lại.

Hãy xem xét quy trình tác vụ sau đây cho Tác vụ A hiện tại có 3 hoạt động trong ngăn xếp, bao gồm cả 2 hoạt động trong hoạt động hiện tại:

  1. Người dùng sử dụng nút hoặc cử chỉ Màn hình chính, sau đó khởi động một ứng dụng mới từ trình chạy ứng dụng.

    Khi Màn hình chính xuất hiện, Nhiệm vụ A sẽ chuyển sang chế độ nền. Khi ứng dụng mới khởi động, hệ thống sẽ bắt đầu một tác vụ cho ứng dụng đó (Tác vụ B) bằng ngăn xếp hoạt động riêng.

  2. Sau khi tương tác với ứng dụng đó, người dùng quay lại Màn hình chính một lần nữa và chọn ứng dụng ban đầu đã bắt đầu Tác vụ A.

    Bây giờ, Tác vụ A xuất hiện trên nền trước – cả ba hoạt động trong ngăn xếp của tác vụ này đều còn nguyên vẹn và hoạt động ở đầu ngăn xếp sẽ tiếp tục. Tại thời điểm này, người dùng cũng có thể chuyển về Nhiệm vụ B bằng cách chuyển đến Màn hình chính và chọn biểu tượng ứng dụng đã bắt đầu nhiệm vụ đó hoặc bằng cách chọn nhiệm vụ của ứng dụng trên màn hình gần đây.

Nhiều phiên bản hoạt động

Hình 3. Một hoạt động có thể được tạo thực thể nhiều lần.

Vì các hoạt động trong ngăn xếp lui không bao giờ được sắp xếp lại, nên nếu ứng dụng của bạn cho phép người dùng bắt đầu một hoạt động cụ thể từ nhiều hoạt động, thì một thực thể mới của hoạt động đó sẽ được tạo và đẩy vào ngăn xếp, thay vì đưa bất kỳ thực thể nào trước đó của hoạt động lên đầu. Do đó, một hoạt động trong ứng dụng của bạn có thể được tạo thực thể nhiều lần, ngay cả từ các tác vụ khác nhau, như minh hoạ trong hình 3.

Nếu người dùng quay lại bằng nút Quay lại hoặc cử chỉ, thì các thực thể của hoạt động sẽ xuất hiện theo thứ tự mở, mỗi thực thể có trạng thái giao diện người dùng riêng. Tuy nhiên, bạn có thể sửa đổi hành vi này nếu không muốn một hoạt động được tạo thực thể nhiều lần. Để biết thêm thông tin, hãy xem bài viết Quản lý việc cần làm.

Môi trường nhiều cửa sổ

Khi các ứng dụng chạy đồng thời trong môi trường nhiều cửa sổ (được hỗ trợ trong Android 7.0 (cấp độ API 24) trở lên), hệ thống sẽ quản lý các tác vụ riêng biệt cho từng cửa sổ. Mỗi khoảng thời gian có thể có nhiều nhiệm vụ. Điều này cũng đúng với các ứng dụng Android chạy trên Chromebook: hệ thống quản lý các tác vụ hoặc nhóm tác vụ trên cơ sở từng cửa sổ.

Tóm tắt vòng đời

Tóm tắt hành vi mặc định cho các hoạt động và tác vụ:

  • Khi Hoạt động A bắt đầu Hoạt động B, Hoạt động A sẽ dừng nhưng hệ thống vẫn giữ lại trạng thái của hoạt động đó, chẳng hạn như vị trí cuộn và mọi văn bản đã nhập vào biểu mẫu. Nếu người dùng nhấn hoặc sử dụng cử chỉ Quay lại khi đang ở Hoạt động B, thì Hoạt động A sẽ tiếp tục với trạng thái được khôi phục.

  • Khi người dùng rời khỏi một tác vụ bằng nút Màn hình chính hoặc cử chỉ, hoạt động hiện tại sẽ dừng lại và tác vụ của hoạt động đó sẽ chuyển sang chế độ nền. Hệ thống giữ lại trạng thái của mọi hoạt động trong tác vụ. Nếu sau đó người dùng tiếp tục tác vụ bằng cách chọn biểu tượng trình chạy đã bắt đầu tác vụ, thì tác vụ đó sẽ xuất hiện trên nền trước và tiếp tục hoạt động ở đầu ngăn xếp.

  • Nếu người dùng nhấn hoặc vuốt để Quay lại, thì hoạt động hiện tại sẽ được bật lên từ ngăn xếp và bị huỷ. Hoạt động trước đó trong ngăn xếp sẽ tiếp tục. Khi một hoạt động bị huỷ, hệ thống sẽ không giữ lại trạng thái của hoạt động đó.

    Hành vi này khác với hoạt động của trình chạy gốc trên Android 12 (cấp độ API 31) trở lên.

  • Hệ thống có thể tạo thực thể cho các hoạt động nhiều lần, ngay cả từ các tác vụ khác.

Quản lý tác vụ

Android quản lý các tác vụ và ngăn xếp lui bằng cách đặt tất cả hoạt động được bắt đầu liên tiếp trong cùng một tác vụ, theo ngăn xếp vào sau ra trước. Cách này hoạt động hiệu quả với hầu hết các ứng dụng và bạn thường không phải lo lắng về cách các hoạt động liên kết với tác vụ hoặc cách các hoạt động tồn tại trong ngăn xếp lui.

Tuy nhiên, bạn có thể quyết định rằng bạn muốn làm gián đoạn hành vi thông thường. Ví dụ: bạn có thể muốn một hoạt động trong ứng dụng bắt đầu một tác vụ mới khi hoạt động đó được khởi động, thay vì được đặt trong tác vụ hiện tại. Hoặc khi bắt đầu một hoạt động, bạn có thể muốn đưa một thực thể hiện có của hoạt động đó lên trước, thay vì tạo một thực thể mới ở đầu ngăn xếp lui. Hoặc bạn có thể muốn xoá tất cả hoạt động khỏi ngăn xếp lui, ngoại trừ hoạt động gốc khi người dùng rời khỏi tác vụ.

Bạn có thể thực hiện những việc này và nhiều việc khác bằng cách sử dụng các thuộc tính trong phần tử tệp kê khai <activity> và các cờ trong ý định mà bạn truyền đến startActivity().

Sau đây là các thuộc tính <activity> chính mà bạn có thể dùng để quản lý tác vụ:

Và đây là các cờ ý định chính mà bạn có thể sử dụng:

Các phần sau đây thảo luận về cách sử dụng các thuộc tính tệp kê khai và cờ ý định này để xác định cách các hoạt động liên kết với tác vụ và cách các hoạt động đó hoạt động trong ngăn xếp lui.

Các phần sau đây cũng thảo luận về cách hệ thống biểu thị và quản lý các tác vụ cũng như hoạt động trong màn hình gần đây. Thông thường, bạn cho phép hệ thống xác định cách biểu thị tác vụ và hoạt động của bạn trong màn hình gần đây và bạn không cần sửa đổi hành vi này. Để biết thêm thông tin, hãy xem Màn hình Gần đây.

Xác định chế độ khởi chạy

Chế độ khởi chạy cho phép bạn xác định cách liên kết một thực thể mới của hoạt động với tác vụ hiện tại. Bạn có thể xác định chế độ khởi chạy theo hai cách, được mô tả trong các phần sau:

  • Sử dụng tệp kê khai

    Khi khai báo một hoạt động trong tệp kê khai, bạn có thể chỉ định cách hoạt động liên kết với các tác vụ khi bắt đầu.

  • Sử dụng cờ ý định

    Khi gọi startActivity(), bạn có thể thêm một cờ trong Intent để khai báo cách thức (hoặc liệu) hoạt động mới liên kết với tác vụ hiện tại.

Vì vậy, nếu Hoạt động A bắt đầu Hoạt động B, thì Hoạt động B có thể xác định trong tệp kê khai cách liên kết với tác vụ hiện tại và Hoạt động A có thể sử dụng cờ ý định để yêu cầu cách Hoạt động B có thể liên kết với tác vụ hiện tại.

Nếu cả hai hoạt động đều xác định cách Hoạt động B liên kết với một tác vụ, thì yêu cầu của Hoạt động A (như được xác định trong ý định) sẽ được ưu tiên hơn yêu cầu của Hoạt động B (như được xác định trong tệp kê khai).

Xác định chế độ khởi chạy bằng tệp kê khai

Khi khai báo một hoạt động trong tệp kê khai, bạn có thể chỉ định cách hoạt động liên kết với một tác vụ bằng cách sử dụng thuộc tính launchMode của phần tử <activity>.

Có 5 chế độ khởi chạy mà bạn có thể chỉ định cho thuộc tính launchMode:

  1. "standard"
    Chế độ mặc định. Hệ thống tạo một thực thể mới của hoạt động trong tác vụ mà hoạt động đó được bắt đầu và chuyển ý định đến đó. Hệ thống có thể tạo thực thể cho hoạt động này nhiều lần, mỗi thực thể có thể thuộc về các tác vụ khác nhau và một tác vụ có thể có nhiều thực thể.
  2. "singleTop"
    Nếu một thực thể hoạt động đã tồn tại ở đầu tác vụ hiện tại, hệ thống sẽ chuyển ý định đến thực thể đó thông qua lệnh gọi phương thức onNewIntent(), thay vì tạo một thực thể mới của hoạt động. Hoạt động được tạo thực thể nhiều lần, mỗi thực thể có thể thuộc về các tác vụ khác nhau và một tác vụ có thể có nhiều thực thể (nhưng chỉ khi hoạt động ở đầu ngăn xếp lui không phải là một thực thể hiện có của hoạt động).

    Ví dụ: giả sử ngăn xếp lui của một tác vụ bao gồm hoạt động gốc A với các hoạt động B, C và D ở trên cùng (vì vậy, ngăn xếp là A-B-C-D, với D ở trên cùng). Một ý định đến cho một hoạt động thuộc loại D. Nếu D có chế độ khởi chạy mặc định "standard", thì một thực thể mới của lớp sẽ được khởi chạy và ngăn xếp sẽ trở thành A-B-C-D-D. Tuy nhiên, nếu chế độ khởi chạy của D là "singleTop", thì thực thể hiện có của D sẽ nhận được ý định thông qua onNewIntent(), vì thực thể này nằm ở đầu ngăn xếp và ngăn xếp vẫn là A-B-C-D. Mặt khác, nếu một ý định đến cho một hoạt động thuộc loại B, thì một thực thể mới của B sẽ được thêm vào ngăn xếp ngay cả khi chế độ khởi chạy của nó là "singleTop".

  3. "singleTask"
    Hệ thống tạo hoạt động vào thư mục gốc của một việc cần làm mới hoặc định vị hoạt động trong một việc cần làm hiện có bằng cùng một đối tượng chung sở thích. Nếu một thực thể của hoạt động đã tồn tại, hệ thống sẽ chuyển ý định đến thực thể hiện có thông qua lệnh gọi đến phương thức onNewIntent(), thay vì tạo một thực thể mới. Trong khi đó, tất cả các hoạt động khác ở trên cùng sẽ bị huỷ.
  4. "singleInstance"
    Hành vi này giống với "singleTask", ngoại trừ việc hệ thống không chạy bất kỳ hoạt động nào khác vào tác vụ đang giữ thực thể đó. Hoạt động luôn là thành phần đơn nhất và duy nhất trong tác vụ của nó. Mọi hoạt động do hoạt động này bắt đầu đều mở trong một tác vụ riêng biệt.
  5. "singleInstancePerTask"
    Hoạt động chỉ có thể chạy dưới dạng hoạt động gốc của tác vụ (hoạt động đầu tiên đã tạo tác vụ) và do đó chỉ có một thực thể duy nhất của hoạt động này trong tác vụ. Trái ngược với chế độ khởi chạy singleTask, hoạt động này có thể được bắt đầu trong nhiều thực thể ở các tác vụ khác nhau nếu bạn đặt cờ FLAG_ACTIVITY_MULTIPLE_TASK hoặc FLAG_ACTIVITY_NEW_DOCUMENT.

Ví dụ: Trình duyệt Android chỉ định singleTask trong <activity> để hoạt động của trình duyệt không được đặt trong tác vụ của ứng dụng. Thay vào đó, một tác vụ mới sẽ bắt đầu cho Trình duyệt hoặc một tác vụ nền hiện có của Trình duyệt sẽ xuất hiện.

Bất kể hoạt động bắt đầu trong một tác vụ mới hay trong cùng một tác vụ với hoạt động đã bắt đầu, nút Quay lại và cử chỉ luôn đưa người dùng đến hoạt động trước đó. Tuy nhiên, nếu bạn bắt đầu một hoạt động chỉ định chế độ khởi chạy singleTask và một thực thể của hoạt động đó tồn tại trong một tác vụ ở chế độ nền, thì toàn bộ tác vụ đó sẽ được đưa lên nền trước. Tại thời điểm này, ngăn xếp lui bao gồm tất cả hoạt động trong tác vụ được đưa lên đầu ngăn xếp. Hình 4 cho thấy loại tình huống này.

Hình 4. Hình minh hoạ cách thêm một hoạt động có chế độ chạy "singleTask" vào ngăn xếp lui. Nếu hoạt động đã là một phần của tác vụ nền có ngăn xếp lui riêng, thì toàn bộ ngăn xếp lui đó cũng sẽ xuất hiện ở đầu tác vụ hiện tại.

Để biết thêm thông tin về cách sử dụng chế độ khởi chạy trong tệp kê khai, hãy xem tài liệu về phần tử <activity>.

Xác định chế độ khởi chạy bằng cờ Ý định

Khi bắt đầu một hoạt động, bạn có thể sửa đổi mối liên kết mặc định của một hoạt động với tác vụ của hoạt động đó bằng cách thêm cờ vào ý định mà bạn phân phối đến startActivity(). Sau đây là các cờ mà bạn có thể dùng để sửa đổi hành vi mặc định:

FLAG_ACTIVITY_NEW_TASK

Hệ thống sẽ bắt đầu hoạt động trong một tác vụ mới. Nếu một tác vụ đang chạy cho hoạt động được bắt đầu, thì tác vụ đó sẽ được đưa lên nền trước và khôi phục trạng thái gần đây nhất, đồng thời hoạt động sẽ nhận được ý định mới trong onNewIntent().

Thao tác này tạo ra hành vi tương tự như giá trị "singleTask" launchMode được thảo luận trong phần trước.

FLAG_ACTIVITY_SINGLE_TOP

Nếu hoạt động đang được bắt đầu là hoạt động hiện tại, ở đầu ngăn xếp lui, thì thực thể hiện có sẽ nhận được lệnh gọi đến onNewIntent() thay vì tạo một thực thể mới của hoạt động.

Thao tác này tạo ra hành vi tương tự như giá trị "singleTop" launchMode được thảo luận trong phần trước.

FLAG_ACTIVITY_CLEAR_TOP

Nếu hoạt động đang được bắt đầu đã chạy trong tác vụ hiện tại, thì thay vì khởi chạy một thực thể mới của hoạt động đó, hệ thống sẽ huỷ tất cả các hoạt động khác ở trên hoạt động đó. Ý định được phân phối đến thực thể đã tiếp tục của hoạt động, hiện ở trên cùng, thông qua onNewIntent().

Không có giá trị nào cho thuộc tính launchMode tạo ra hành vi này.

FLAG_ACTIVITY_CLEAR_TOP thường được dùng cùng với FLAG_ACTIVITY_NEW_TASK. Khi được sử dụng cùng nhau, các cờ này sẽ xác định một hoạt động hiện có trong một tác vụ khác và đặt hoạt động đó vào vị trí có thể phản hồi ý định.

Xử lý mối tương quan

Mối quan hệ tương đồng cho biết hoạt động "muốn" thuộc về tác vụ nào. Theo mặc định, tất cả hoạt động trong cùng một ứng dụng đều có mối quan hệ tương đồng với nhau: chúng "thích" nằm trong cùng một tác vụ.

Tuy nhiên, bạn có thể sửa đổi mối quan hệ tương đồng mặc định cho một hoạt động. Các hoạt động được xác định trong các ứng dụng khác nhau có thể có chung một đối tượng tương đồng và các hoạt động được xác định trong cùng một ứng dụng có thể được chỉ định các đối tượng tương đồng khác nhau cho tác vụ.

Bạn có thể sửa đổi mối quan hệ của một hoạt động bằng cách sử dụng thuộc tính taskAffinity của phần tử <activity>.

Thuộc tính taskAffinity lấy một giá trị chuỗi phải khác với tên gói mặc định được khai báo trong phần tử <manifest>, vì hệ thống sử dụng tên đó để xác định mối quan hệ tương đồng mặc định của tác vụ cho ứng dụng.

Mức độ tương đồng phát huy tác dụng trong hai trường hợp:

  1. Khi ý định chạy một hoạt động chứa cờ FLAG_ACTIVITY_NEW_TASK.

    Theo mặc định, một hoạt động mới sẽ được chạy trong tác vụ của hoạt động đã gọi startActivity(). Mảnh này được đẩy vào cùng một ngăn xếp lui với mảnh gọi.

    Tuy nhiên, nếu ý định được truyền đến startActivity() chứa cờ FLAG_ACTIVITY_NEW_TASK, thì hệ thống sẽ tìm một tác vụ khác để lưu trữ hoạt động mới. Thông thường, đây là một nhiệm vụ mới. Tuy nhiên, điều này không nhất thiết phải xảy ra. Nếu có một tác vụ hiện có cùng mối quan hệ với hoạt động mới, thì hoạt động đó sẽ được khởi chạy vào tác vụ đó. Nếu không, ứng dụng sẽ bắt đầu một nhiệm vụ mới.

    Nếu cờ này khiến một hoạt động bắt đầu một tác vụ mới và người dùng sử dụng nút hoặc cử chỉ Màn hình chính để rời khỏi tác vụ đó, thì phải có cách để người dùng quay lại tác vụ đó. Một số thực thể, chẳng hạn như trình quản lý thông báo, luôn bắt đầu các hoạt động trong một tác vụ bên ngoài, không bao giờ là một phần của tác vụ riêng, vì vậy, các thực thể này luôn đặt FLAG_ACTIVITY_NEW_TASK trong ý định mà chúng truyền đến startActivity().

    Nếu một thực thể bên ngoài có thể gọi hoạt động của bạn bằng cờ này, hãy cung cấp cho người dùng một cách độc lập để quay lại, chẳng hạn như biểu tượng trình chạy từ bộ lọc CATEGORY_LAUNCHER trên hoạt động gốc của tác vụ. Để biết thêm thông tin, hãy xem phần Bắt đầu một nhiệm vụ.

  2. Khi một hoạt động có thuộc tính allowTaskReparenting được đặt thành "true".

    Trong trường hợp này, hoạt động có thể di chuyển từ tác vụ bắt đầu sang tác vụ có đối tượng tương đồng khi tác vụ đó xuất hiện trên nền trước.

    Ví dụ: giả sử một hoạt động báo cáo điều kiện thời tiết ở các thành phố được chọn được xác định là một phần của ứng dụng du lịch. Hoạt động này có cùng đối tượng tương đồng với các hoạt động khác trong cùng một ứng dụng, đối tượng tương đồng mặc định của ứng dụng và có thể được gán lại hoạt động mẹ bằng thuộc tính này.

    Khi một trong các hoạt động của bạn bắt đầu hoạt động của người báo cáo thời tiết, ban đầu hoạt động đó thuộc cùng một tác vụ với hoạt động của bạn. Tuy nhiên, khi tác vụ của ứng dụng du lịch xuất hiện ở nền trước, hoạt động báo cáo thời tiết sẽ được gán lại cho tác vụ đó và hiển thị trong đó.

Xoá ngăn xếp lui

Nếu người dùng rời khỏi một tác vụ trong thời gian dài, thì hệ thống sẽ xoá tất cả hoạt động khỏi tác vụ đó, ngoại trừ hoạt động gốc. Khi người dùng quay lại tác vụ, chỉ hoạt động gốc được khôi phục. Hệ thống hoạt động theo cách này dựa trên giả định rằng sau một khoảng thời gian dài, người dùng đã từ bỏ việc họ đang làm trước đó và quay lại tác vụ để bắt đầu một việc mới.

Có một số thuộc tính hoạt động mà bạn có thể sử dụng để sửa đổi hành vi này:

alwaysRetainTaskState
Khi thuộc tính này được đặt thành "true" trong hoạt động gốc của một tác vụ, hành vi mặc định vừa mô tả sẽ không xảy ra. Tác vụ giữ lại tất cả hoạt động trong ngăn xếp của nó ngay cả sau một khoảng thời gian dài.
clearTaskOnLaunch

Khi thuộc tính này được đặt thành "true" trong hoạt động gốc của một tác vụ, tác vụ đó sẽ bị xoá xuống hoạt động gốc bất cứ khi nào người dùng rời khỏi tác vụ và quay lại tác vụ đó. Nói cách khác, đây là giá trị ngược lại của alwaysRetainTaskState. Người dùng luôn quay lại tác vụ ở trạng thái ban đầu, ngay cả khi chỉ rời khỏi tác vụ trong giây lát.

finishOnTaskLaunch

Thuộc tính này giống như clearTaskOnLaunch, nhưng hoạt động trên một hoạt động duy nhất, chứ không phải toàn bộ tác vụ. Cờ này cũng có thể khiến mọi hoạt động kết thúc, ngoại trừ hoạt động gốc. Khi được đặt thành "true", hoạt động sẽ chỉ là một phần của tác vụ trong phiên hiện tại. Nếu người dùng rời khỏi rồi quay lại tác vụ, thì tác vụ đó sẽ không còn nữa.

Bắt đầu một việc cần làm

Bạn có thể thiết lập một hoạt động làm điểm truy cập cho một tác vụ bằng cách cung cấp cho hoạt động đó một bộ lọc ý định với "android.intent.action.MAIN" là hành động được chỉ định và "android.intent.category.LAUNCHER" là danh mục được chỉ định:

<activity ... >
    <intent-filter ... >
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    ...
</activity>

Bộ lọc ý định này hiển thị một biểu tượng và nhãn cho hoạt động trong trình chạy ứng dụng, giúp người dùng có thể chạy hoạt động và quay lại tác vụ mà hoạt động đó tạo ra.

Khả năng thứ hai này rất quan trọng. Người dùng phải có thể rời khỏi một nhiệm vụ rồi quay lại sau bằng trình chạy hoạt động này. Vì lý do này, chỉ sử dụng hai chế độ khởi chạy đánh dấu hoạt động là luôn bắt đầu một tác vụ, "singleTask" và "singleInstance", khi hoạt động có bộ lọc ACTION_MAIN và CATEGORY_LAUNCHER.

Ví dụ: hãy tưởng tượng điều gì có thể xảy ra nếu thiếu bộ lọc: một ý định chạy hoạt động "singleTask", bắt đầu một tác vụ mới và người dùng dành một chút thời gian để làm việc trong tác vụ đó. Sau đó, người dùng sử dụng nút hoặc cử chỉ Màn hình chính. Tác vụ hiện được gửi đến nền và không hiển thị. Lúc này, người dùng không có cách nào để quay lại tác vụ vì tác vụ đó không được thể hiện trong trình chạy ứng dụng.

Đối với những trường hợp bạn không muốn người dùng có thể quay lại một hoạt động, hãy đặt thuộc tính finishOnTaskLaunch của phần tử <activity> thành "true". Để biết thêm thông tin, hãy xem phần Xoá ngăn xếp lui.

Để biết thêm thông tin về cách biểu thị và quản lý các tác vụ và hoạt động trong màn hình gần đây, hãy xem phần Màn hình gần đây.

Tài nguyên khác