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

Nhiệm vụ là một tập hợp các hoạt động mà người dùng tương tác khi cố gắng làm việc 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 được gọi là ngăn xếp lui theo thứ tự mở từng hoạt động.

Ví dụ: ứng dụng email có thể có một hoạt động để hiển thị danh sách các tin nhắn mới. Khi người dùng chọn một thì một hoạt động mới sẽ mở ra để bạn xem thông báo đó. Đã thêm hoạt động mới này vào ngăn xếp lui. Sau đó, khi người dùng nhấn hoặc cử chỉ Quay lại, hoạt động mới đó 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 nó

Màn hình chính của thiết bị là nơi bạn bắt đầu thực hiện hầu hết các thao tác. Khi người dùng chạm 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 đó chạy trên nền trước. Nếu không có tác vụ nào cho ứng dụng, thì công việc mới được tạo và thành phần chính hoạt động của ứng dụng đó sẽ mở ra làm 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 trên cùng của ngăn xếp và lấy tiêu điểm. Hoạt động trước đó vẫn nằm trong ngăn xếp, nhưng đã 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 là bật ra khỏi đầu ngăn xếp và bị huỷ bỏ. Chiến lược phát hành đĩa đơn hoạt động trước đó tiếp tục và trạng thái trước đó của giao diện người dùng được khôi phục.

Hoạt động trong ngăn xếp không bao giờ được sắp xếp lại mà chỉ được đẩy lên và đẩy ra khỏi ngăn xếp khi chúng được bắt đầu bởi hoạt động hiện tại và bị người dùng đóng thông qua cử chỉ hoặc nút Quay lại. Do đó, ngăn xếp lui hoạt động như cấu trúc đối tượng vào sau, ra trước. Hình 1 hiển thị dòng thời gian với các hoạt động được đẩy lên và đẩy ra từ ngăn xếp lui.

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

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

Hành vi nhấn quay lại cho các hoạt động của trình chạy gốc

Hoạt động của trình chạy gốc là các hoạt động khai báo một ý định lọc có cả hai ACTION_MAINCATEGORY_LAUNCHER. Những hoạt động này là riêng biệ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 cử chỉ Quay lại từ một hoạt động của trình chạy gốc, hệ thống xử lý sự kiện theo cách khác nhau, tùy 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ẽ chuyển hoạt động và tác vụ của hoạt động đó sang chế độ 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 rời khỏi ứng dụng bằng cử chỉ hoặc nút Màn hình chính.

Trong hầu hết các trường hợp, hành vi này có nghĩa là người dùng có thể tiếp tục ứ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ừ thiết bị nguội trạng thái.

Nếu bạn cần cung cấp tính năng điều hướng quay lại tuỳ chỉnh, bạn nên sử dụng AndroidX Activity API thay vì ghi đè onBackPressed(). AndroidX Activity API 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 hệ thống Nhấn vào mặt sau.

Tuy nhiên, nếu ứng dụng của bạn ghi đè onBackPressed() để xử lý Quay lại điều hướng và hoàn tất hoạt động, cập nhật phương thức triển khai của bạn để gọi đến super.onBackPressed() thay vì kết thúc. Gọi điện super.onBackPressed() chuyển hoạt động và tác vụ của hoạt động đó sang chế độ nền khi phù hợp và cung cấp 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ụ ở nền trước và nền trước

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

Công việc là một đơn vị nhất quán có thể chuyển sang nền khi người dùng bắt đầu công việc 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ụ bị dừng, nhưng ngăn xếp lui của tác vụ vẫn giữ nguyên — tác vụ sẽ mất tiêu điểm trong khi một nhiệm vụ khác diễn ra, như minh hoạ trong hình 2. Đáp sau đó công việc 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 tắt.

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

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

    Khi Màn hình chính xuất hiện, Tác vụ A sẽ chuyển sang chế độ nền. Khi dịch vụ mới ứng dụng khởi động, thì 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 riêng hoạt động.

  2. Sau khi tương tác với ứng dụng đó, người dùng quay lại Trang chủ một lần nữa và chọn đã khởi động Tác vụ A ban đầu.

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

Nhiều thực thể hoạt động

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

Do 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ực thể của hoạt động đó được tạo và đẩy vào ngăn xếp, thay vì đưa mọi thực thể trước đó của hoạt động lên đầu. Như vậy, 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, thậm chí từ các nhiệm vụ, như được minh hoạ trong Hình 3.

Nếu người dùng lùi lại bằng nút Quay lại nút hoặc cử chỉ, các phiên bản của hoạt động được hiển thị theo thứ tự được mở, mỗi trang có trạng thái giao diện người dùng riêng. Tuy nhiên, bạn có thể sửa đổi nếu bạn không muốn một hoạt động được tạo thực thể nhiều lần. Học hỏi tìm hiểu thêm về vấn đề này trong phần quản lý nhiệm vụ.

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

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

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

Cách tóm tắt hành vi mặc định của các hoạt động và tác vụ:

  • Khi Hoạt động A khởi chạy Hoạt động B, Hoạt động A sẽ dừng nhưng hệ thống sẽ dừng lại giữ nguyên trạng thái, chẳng hạn như vị trí cuộn và bất kỳ văn bản nào được 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, Hoạt động A sẽ tiếp tục khi 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 bị dừng và tác vụ của hoạt động đó sẽ chuyển sang chạy trong 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ụ, tác vụ sẽ chuyển đế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 cử chỉ Quay lại, hoạt động hiện tại sẽ được đẩy từ ngăn xếp và bị huỷ bỏ. Hoạt động trước đó trong ngăn xếp sẽ tiếp tục. Thời gian một hoạt động bị huỷ bỏ, 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 khi ứng dụng của bạn đang chạy trên một thiết bị chạy Android 12 trở lên.

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

Quản lý công việc

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 đã bắt đầu liên tiếp trong cùng một tác vụ, theo thứ tự trước tiên ngăn xếp. Tính năng 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 hoạt động của bạn được liên kết với nhiệm vụ hoặc cách chúng tồn tại ngăn xếp.

Tuy nhiên, bạn có thể quyết định rằng mình muốn làm gián đoạn hoạt động bình thường đó. Ví dụ: có thể bạn muốn một hoạt động trong ứng dụng của mình bắt đầu một tác vụ mới khi hoạt động đó đã bắt đầu, thay vì được đặt trong tác vụ hiện tại. Hoặc, khi bạn bắt đầu một của hoạt động, bạn nên đưa ra một thực thể hiện có của hoạt động đó, 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á ngăn xếp lui khỏi mọi hoạt động, 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à gắn cờ trong ý định mà bạn truyền đến startActivity().

Dưới đây là các thuộc tính <activity> chính mà bạn có thể dùng để quản lý việc cần làm:

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

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

Ngoài ra, chúng tôi cũng sẽ thảo luận về những điểm cần cân nhắc liên quan đến cách thức thực hiện nhiệm vụ và hoạt động được trình bày và quản lý trên màn hình Gần đây. Thông thường, bạn để xác định cách tác vụ và các hoạt động của bạn được thể hiện trong Màn hình Gần đây (Recents) và bạn không cần phải sửa đổi hành vi này. Để biết thêm hãy xem màn hình Gần đây.

Xác định chế độ chạy

Các chế độ chạy cho phép bạn xác định cách liên kết với một thực thể mới của hoạt động với nhiệm vụ hiện tại. Bạn có thể xác định chế độ chạy theo hai cách, như 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 bạn gọi startActivity()! bạn có thể thêm một lá cờ vào 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 khởi chạy Hoạt động B, thì Hoạt động B có thể xác định trong tệp kê khai cách hoạt động đó 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 sẽ xác định cách Hoạt động B liên kết với một tác vụ, rồi đến Hoạt động A yêu cầu, như được định nghĩa trong ý định, được thực hiện theo yêu cầu của Hoạt động B, như được xác định trong tệp kê khai.

Xác định chế độ 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 liên kết với một tác vụ bằng cách sử dụng Phần tử <activity> launchMode.

Có 5 chế độ chạy mà bạn có thể gán cho thuộc tính launchMode:

  1. "standard"
    Chế độ mặc định. Hệ thống sẽ tạo một thực thể mới của hoạt động trong tác vụ bắt đầu và định tuyến ý định đến đó. Hoạt động có thể là đượ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 nhiệm vụ có thể có nhiều thực thể.
  2. "singleTop"
    Nếu một thực thể của hoạt động đã tồn tại ở đầu tác vụ hiện tại, hệ thống chuyển ý định đến thực thể đó thông qua lệnh gọi đến onNewIntent() thay vì tạo một thực thể mới của hoạt động. Hoạt động này được tạo thực thể nhiều lần, mỗi thực thể có thể thuộc về các nhiệm 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 ở trên cùng của 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 (do đó 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 loại D. Nếu D có lần khởi chạy "standard" mặc định , một thực thể mới của lớp được chạy và ngăn xếp trở thành A-B-C-D-D. Tuy nhiên, nếu chế độ chạy của D là "singleTop", thì thực thể hiện có của D là nhận ý định thông qua onNewIntent(), vì nó nằm ở đầu ngăn xếp và ngăn xếp vẫn là A-B-C-D. Nếu: mặt khác, một ý định xuất hiện cho một hoạt động loại B, sau đó một thực thể mới của B được thêm vào ngăn xếp ngay cả khi chế độ 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 tác vụ mới hoặc định vị hoạt động đối với một công việc hiện có có cùng đối tượng chung sở thích. Nếu một phiên bản của hoạt động đã tồn tại, hệ thống sẽ định tuyến ý định đối với thực thể hiện có thông qua lệnh gọi đến thực thể đó onNewIntent() thay vì tạo một thực thể mới. Trong khi đó, tất cả những người khác các hoạt động nằm trên đó đều bị huỷ bỏ.
  4. "singleInstance".
    Hành vi này giống như "singleTask", ngoại trừ việc hệ thống không chạy bất kỳ hành vi nào khác hoạt động vào tác vụ đang lưu giữ thực thể đó. Hoạt động luôn là thành viê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 thành một nhiệm vụ riêng.
  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 hoạt động đã tạo ra tác vụ, và do đó chỉ có thể có một phiên bản của hoạt động này trong một tác vụ. Trái ngược với chế độ chạy singleTask, thuộc tính này hoạt động có thể được bắt đầu trong nhiều phiên bản trong các tác vụ khác nhau nếu FLAG_ACTIVITY_MULTIPLE_TASK hoặc FLAG_ACTIVITY_NEW_DOCUMENT cờ đã được đặt.

Một ví dụ khác, ứng dụng Trình duyệt Android khai báo rằng trình duyệt web hoạt động luôn mở trong tác vụ riêng của nó bằng cách chỉ định singleTask chế độ chạy trong <activity> . Điều này có nghĩa là nếu ứng dụng của bạn đưa ra ý định để mở ứng dụng Android Trình duyệt, hoạt động của trình duyệt không được đặt trong cùng một tác vụ với ứng dụng của bạn. Thay vào đó, một tác vụ mới sẽ bắt đầu cho Trình duyệt hoặc nếu Trình duyệt đã có một tác vụ chạy trong nền, tác vụ đó sẽ được đưa ra để xử lý ý định.

Bất kể một 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 hành động đó, nút Quay lại và cử chỉ luôn lấy cho hoạt động trước đó. Tuy nhiên, nếu bạn bắt đầu một hoạt động chỉ định chế độ chạy singleTask và một thực thể của hoạt động đó tồn tại trong một tác vụ trong 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ả các hoạt động từ nhiệm vụ được đưa lên trước tại đầu ngăn xếp. Hình 4 cho thấy loại tình huống này.

Hình 4. Hình ảnh minh hoạ cách một hoạt động có bản khởi chạy chế độ "singleTask" được thêm vào ngăn xếp lui. Nếu hoạt động đã là một phần của tác vụ trong nền có ngăn xếp lui riêng, thì toàn bộ ngăn xếp lui cũng tiến lên phía trước, phía trên ngăn xếp hiện tại nhiệm vụ đó.

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

Xác định các chế độ 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 hoạt động vào tác vụ bằng cách thêm cờ vào ý định mà bạn gửi đến startActivity(). Cờ mà bạn có thể sử dụng để sửa đổi hành vi mặc định như sau:

FLAG_ACTIVITY_NEW_TASK

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

Thao tác này tạo ra hành vi tương tự như "singleTask" Giá trị 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, thì ở đầu mặt sau ngăn xếp 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ư "singleTop" Giá trị launchMode được thảo luận trong phần trước.

FLAG_ACTIVITY_CLEAR_TOP

Nếu hoạt động đang 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ỷ bỏ tất cả các hoạt động khác nằm phía trên nó. Mục đích là được phân phối đến thực thể đã tiếp tục của hoạt động, giờ ở 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 kết hợp với FLAG_ACTIVITY_NEW_TASK Khi được sử dụng cùng nhau, những cờ này xác định hoạt động hiện có trong một tác vụ khác và đặt hoạt động đó vào một vị trí nơi mã nguồn có thể phản hồi ý định.

Xử lý đối tượng chung sở thích

Đối tượng chung sở thích cho biết tác vụ mà một hoạt động "ưu tiên" để tham gia. Theo mặc định, tất cả các hoạt động trong cùng một ứng dụng đều có đối tượng tương đồng với nhau: họ "ưu tiên" để làm việc đó.

Tuy nhiên, bạn có thể sửa đổi đối tượng tương đồng mặc định cho một hoạt động. Hoạt động đã xác định trong các ứng dụng khác nhau có thể chia sẻ đối tượng chung sở thích và các hoạt động được xác định trong cùng một ứng dụng có thể được giao các công việc liên quan khác nhau.

Bạn có thể sửa đổi đối tượng tương đồng của một hoạt động bằng cách sử dụng taskAffinity của <activity> .

Thuộc tính taskAffinity nhận giá trị chuỗi phải khác với tên gói mặc định được khai báo trong <manifest> vì hệ thống sử dụng tên đó để xác định tác vụ mặc định đối tượng chung sở thích cho ứng dụng.

Đối tượng chung sở thích xuất hiện trong hai trường hợp:

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

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

    Tuy nhiên, nếu ý định được chuyển đến startActivity() có chứa phần tử FLAG_ACTIVITY_NEW_TASK cờ, hệ thống sẽ tìm kiếm một tác vụ khác để chứa hoạt động mới đó. Thường thì đây là một nhiệm vụ mới. Tuy nhiên, bạn không nhất thiết phải làm như vậy. Nếu có tác vụ hiện tại có cùng đối tượng tương đồng với hoạt động mới, hoạt động được khởi chạy trong tác vụ đó. Nếu không, Chrome sẽ bắt đầu một việc cần làm 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 Để thoát khỏi nút màn hình chính hoặc cử chỉ, người dùng phải có cách quay lại việc cần làm. Một số pháp nhân (chẳng hạn như trình quản lý thông báo) luôn bắt đầu hoạt động trong tác vụ bên ngoài, không bao giờ thuộc về tác vụ của riêng họ, vì vậy họ luôn đặt FLAG_ACTIVITY_NEW_TASK trong ý định mà họ truyền đến startActivity()

    Nếu một pháp nhân bên ngoài có thể sử dụng cờ này có thể gọi hoạt động của bạn, hãy lưu ý rằng người dùng có một cách độc lập để quay lại tác vụ đã bắt đầu, chẳng hạn như với biểu tượng trình chạy, trong đó hoạt động gốc của công việc có CATEGORY_LAUNCHER bộ lọc ý định. Để biết thêm thông tin, hãy xem phần bắt đầu việc cần làm.

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

    Trong trường hợp này, hoạt động có thể chuyển từ tác vụ mà nó bắt đầu sang tác vụ đã thực hiện đối tượng tương đồng khi tác vụ đó xuất hiệ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ố đã chọn sẽ được xác định là một phần của ứng dụng du lịch. Có cùng đối tượng chung sở thích giống như 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ông cụ này có thể được gán lại về cấp độ gốc 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 phóng viên thời tiết, ban đầu mục này thuộc về cùng một nhiệm vụ với của bạn. Tuy nhiên, khi tác vụ của ứng dụng du lịch xuất hiện trên nền trước, hoạt động của phóng viên thời tiết được chỉ định lại cho nhiệm vụ đó và hiển thị trong nhiệm vụ đó.

Xoá ngăn xếp lui

Nếu người dùng rời khỏi một tác vụ trong một thời gian dài, hệ thống sẽ xoá tác vụ đó khỏi tất cả ngoại trừ hoạt động gốc. Khi người dùng quay lại tác vụ, chỉ khôi phục hoạt động gốc. Hệ thống sẽ hoạt động theo cách này dựa trên giả định rằng sau khi khoảng thời gian dài hơn mà người dùng bỏ ngang việc đang làm trước và quay lại tác vụ để bắt đầu một công 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ụ, thì hành vi mặc định nêu trên sẽ không xảy ra. Tác vụ sẽ giữ lại tất cả trong ngăn xếp ngay cả sau một 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 với nó. Nói cách khác, thuật ngữ này trái ngược với alwaysRetainTaskState. Chiến lược phát hành đĩa đơn người dùng luôn quay lại tác vụ ở trạng thái ban đầu, ngay cả sau khi rời khỏi nhiệm vụ của bạn trong giây lát.

finishOnTaskLaunch

Thuộc tính này giống như clearTaskOnLaunch, nhưng nó hoạt động trên một hoạt động đơn lẻ chứ không phải toàn bộ tác vụ. Việc này cũng có thể khiến mọi hoạt động cần kết thúc, ngoại trừ hoạt động gốc. Khi chế độ này được đặt thành "true", hoạt động vẫn 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 đi rồi quay lại tác vụ, thì tác vụ đó sẽ không còn tồn tại.

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 gán một ý định cho hoạt động đó lọc với "android.intent.action.MAIN" là hành động được chỉ định và "android.intent.category.LAUNCHER" làm 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 thuộc loại này khiến biểu tượng và nhãn cho hoạt động hiển thị trong trình chạy ứng dụng, giúp người dùng khởi chạy hoạt động và quay lại tác vụ mà nó tạo bất cứ lúc nào sau khi khởi chạy.

Kỹ năng thứ hai này rất quan trọng. Người dùng phải rời khỏi được tác 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 các chế độ chạy đánh dấu các hoạt động là luôn bắt đầu một tác vụ, "singleTask""singleInstance", khi hoạt động có ACTION_MAINCATEGORY_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 khởi chạy hoạt động "singleTask", khởi tạo tác vụ mới và người dùng dành thời gian làm việc đó. Sau đó, người dùng sử dụng nút Màn hình chính hoặc cử chỉ. Lúc này, việc cần làm sẽ được chuyển xuống dưới nền và không xuất hiện. Giờ đâ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 ứng dụng trình chạy.

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

Thông tin khác về cách trình bày và quản lý các nhiệm vụ và hoạt động trong màn hình Gần đây có trong phần Gần đây màn hình.

Tài nguyên khác