Giả sử chế độ khởi chạy của chúng là Chuẩn (Không sử dụng bất kỳ ý định nào cờ). Và x là Hoạt động chính của ứng dụng A; 1 là Hoạt động chính của ứng dụng B.
1) Khởi chạy ứng dụng A, sau đó x-> y -> 1, nhấn nút Home, khởi chạy ứng dụng A một lần nữa, chúng ta sẽ thấy hoạt động y hoặc 1?
Bạn sẽ thấy hoạt động 1
. Bạn có một tác vụ duy nhất chứa x->y->1
với hoạt động 1
ở đầu ngăn xếp hoạt động trong tác vụ đó. Khi bạn nhấn HOME, tác vụ này được chuyển sang nền. Khi bạn khởi chạy lại ứng dụng, Android sẽ tìm thấy chồng nhiệm vụ và chỉ mang nó (nguyên vẹn) trở lại nền trước, hiển thị cho bạn hoạt động hàng đầu trên ngăn xếp (trong trường hợp này là 1
).
2) Khởi chạy ứng dụng A sau đó x -> 1 -> y -> 2 -> z -> 3, nhấn nút home, ra mắt ứng dụng A, nó sẽ chứa tất cả các hoạt động (x -> 1 - > y -> 2 -> z -> 3) hoặc chỉ chứa x -> y -> z?
Như trên, bạn có một tác vụ duy nhất. Khi bạn nhấn HOME, tác vụ chứa x->1->y->2->z->3
và được chuyển sang nền. Khi bạn khởi động lại ứng dụng A, nhiệm vụ được chuyển tiếp (nguyên vẹn) và bạn sẽ thấy hoạt động 3
ở trên cùng.
Làm cách nào nếu chúng tôi khởi chạy ứng dụng B ngay bây giờ? B sẽ chứa những hoạt động nào?
Vâng, câu hỏi là không đúng. Những gì bạn thực sự muốn biết là "hoạt động này sẽ nhiệm vụ chứa gì?", Nhưng đây là câu trả lời:
Nếu bạn khởi động ứng dụng B từ màn hình HOME, bạn sẽ bắt đầu một nhiệm vụ mới. Tác vụ này sẽ chứa một hoạt động, cụ thể là 1
. Tác vụ này không liên quan gì đến tác vụ khác (vẫn còn trong nền). Thực tế là tác vụ nền chứa các hoạt động từ 2 ứng dụng khác nhau là không liên quan.
Bây giờ, hãy nói hoạt động 1, 2, 3 là SingleTask; x, y, z still Chuẩn:
3) Khởi chạy ứng dụng A, sau đó x -> y -> 1 -> 2, nhấn nút home, khởi chạy ứng dụng A, nó sẽ chứa x -> y chỉ hoặc nó chứa x -> y -> 1 -> 2?
Tại thời điểm hoạt động y
khởi chạy hoạt động 1
, điều này sẽ tạo một tác vụ mới. Vì vậy, bạn sẽ có một nhiệm vụ có chứa hoạt động x->y
và tác vụ thứ hai có chứa 1
. Khi hoạt động 1
khởi chạy hoạt động 2
điều gì xảy ra phụ thuộc vào nhiều hơn chỉ là launchMode
hoạt động. Ngay cả khi hoạt động 2
được khai báo launchMode="singleTask"
, nếu taskAffinity
hoạt động 2
giống với taskAffinity
hoạt động 1
(theo mặc định, nếu chúng thuộc cùng một ứng dụng) thì hoạt động 2
sẽ được tạo trong cùng một tác vụ hoạt động 1
(nghĩa là: hoạt động như thể hoạt động 2
có launchMode="standard"
). Tuy nhiên, nếu hoạt động 1
và hoạt động 2
có khác nhau taskAffinity
, thì hoạt động 2
sẽ được khởi chạy dưới dạng hoạt động gốc trong tác vụ mới. Bây giờ bạn sẽ có 3 nhiệm vụ, như thế này: Task1 chứa x->y
, Task2 chứa 1
và Task3 chứa 2
.
Còn nếu chúng tôi khởi chạy ứng dụng B ngay bây giờ thì sao? ứng dụng B sẽ chỉ chứa 1 hoặc 1 -> 2?
Như trên, điều này phụ thuộc vào taskAffinity
. Nếu taskAffinity
hoạt động 1
và 2
giống nhau, khởi chạy ứng dụng B từ màn hình HOME sẽ mang tác vụ chứa 1->2
lên nền trước.Nếu taskAffinity
hoạt động khác nhau, khởi chạy ứng dụng B từ màn hình HOME sẽ mang lại tác vụ chứa hoạt động 1
tới nền trước.
4) Khởi chạy ứng dụng B, sau đó 1 -> 2 -> 3 -> 1, 2 và 3 sẽ bị hủy không?
No. 2
và 3
sẽ không bị hủy. Giả sử rằng 1
, 2
và 3
tất cả đều có launchMode="singleTask"
thì nó (lại) phụ thuộc vào cài đặt taskAffinity
. Giả sử tất cả các hoạt động có cùng số taskAffinity
, thì bạn sẽ có một tác vụ duy nhất có chứa 1->2->3->1
(bạn sẽ có 2 trường hợp hoạt động 1
) vì taskAffinity
trumps launchMode
.
Nếu tất cả các hoạt động có khác nhau taskAffinity
, thì sau 1->2->3
bạn sẽ có 3 tác vụ riêng biệt, mỗi tác vụ có chứa một hoạt động. Sau đó, khi hoạt động 3
bắt đầu hoạt động 1
, thao tác này sẽ chỉ mang lại hoạt động có chứa hoạt động 1
tới nền trước và sẽ không tạo phiên bản hoạt động mới 1
.
5) Khởi chạy ứng dụng B, sau đó 1 -> 2 -> 3, nhấn nút home, Khởi chạy ứng dụng Một bây giờ, sau đó x -> y -> 2 sau đó nhấn nút quay lại để thả 2. Khởi chạy ứng dụng B bây giờ, hoạt động của nó chứa gì? 1 -> 3 chỉ hoặc 1 -> 2 -> 3?
Một lần nữa, điều này phụ thuộc vào taskAffinity
. Nếu tất cả các hoạt động của ứng dụng B có cùng số taskAffinity
thì sau 1->2->3
bạn sẽ có một nhiệm vụ. Người dùng nhấn nút HOME nhiệm vụ này sẽ chuyển sang nền. Bây giờ người dùng khởi chạy ứng dụng A tạo một nhiệm vụ mới. Sau x->y
nhiệm vụ thứ hai có chứa 2 hoạt động này. Hiện hoạt động y
bắt đầu hoạt động 2
. Vì hoạt động này có launchMode="singleTask"
và có một khác nhau taskAffinity
từ các hoạt động khác trong nhiệm vụ (tất cả đều có taskAffinity
của ứng dụng A), Android sẽ tạo một nhiệm vụ mới với hoạt động 2
làm gốc. Android không thể sử dụng tác vụ hiện có chứa 1->2->3
vì tác vụ đó không chứa hoạt động 2
làm gốc của nó. Khi người dùng nhấn BACK trong 2
, thao tác này sẽ hoàn tất hoạt động 2
sẽ hoàn thành nhiệm vụ thứ ba, đưa người dùng trở lại nhiệm vụ thứ hai có chứa x->y
với hoạt động y
ở trên cùng. Bây giờ, nhấn HOME và khởi chạy ứng dụng B sẽ mang tác vụ đầu tiên hiện có chứa 1->2->3
tới nền trước.
Tuy nhiên, nếu tất cả các hoạt động của ứng dụng B có khác nhau taskAffinity
, thì sau 1->2->3
bạn sẽ có 3 tác vụ riêng biệt mỗi tác vụ chứa một hoạt động. Người dùng nhấn HOME và khởi chạy ứng dụng A tạo một nhiệm vụ mới (bây giờ bạn có 4 nhiệm vụ). Sau x->y
nhiệm vụ thứ tư có chứa 2 hoạt động này. Hiện hoạt động y
bắt đầu hoạt động 2
. Android chỉ đơn giản là mang tác vụ chứa hoạt động 2
tới nền trước. Người dùng nhấn nút BACK, thao tác này kết thúc hoạt động 2
và nhiệm vụ được thực hiện (vì tác vụ đó hiện đang trống), trả lại người dùng cho tác vụ trước đó là nhiệm vụ có chứa x->y
từ ứng dụng A. Khởi chạy ứng dụng B từ màn hình HOME chỉ cần mang công việc có chứa hoạt động 1
lên nền trước.Bây giờ bạn có 3 nhiệm vụ: Task1 chứa hoạt động 1
và ở phía trước, Task2 chứa hoạt động 3
và ở chế độ nền, Task3 chứa x->y
và đang ở chế độ nền.
GHI CHÚ
Tôi nhận ra điều này là phức tạp. Câu trả lời của tôi là từ đầu của tôi, tôi đã không thực sự thực hiện tất cả các kết hợp và kiểm tra (tuy nhiên, tôi đã thực hiện nhiều trường hợp trong quá khứ và tôi biết nó hoạt động như thế nào). Lý do là hầu hết những gì bạn mô tả sẽ không được thực hiện trong thế giới thực, vì vậy các ví dụ chỉ là lý thuyết và không thực tế. Trong thực tế, bạn hầu như không bao giờ cần sử dụng các chế độ khởi động singleTask
hoặc singleInstance
trừ khi bạn đang xây dựng thay thế màn hình chính của riêng mình hoặc bạn cần kiểm soát cẩn thận cách ứng dụng của bạn hoạt động khi ứng dụng khác bắt đầu bằng các ứng dụng khác. Trong hầu hết các trường hợp, bạn sẽ không bao giờ có nhiều hoạt động có chế độ khởi chạy là singleTask
hoặc singleInstance
.
Nếu bạn sử dụng singleInstance
hoặc singleTask
bạn cần phải nhận thức được thế nào taskAffinity
tác phẩm và bạn cũng cần phải chắc chắn rằng bạn có một biểu tượng ứng dụng khác nhau (và có lẽ cũng nhãn ứng dụng) cho từng hoạt động đó được khai báo là 'singleTask' hoặc 'singleInstance'. Nếu không, người dùng sẽ không thể quay lại tác vụ chính xác do cách chúng được hiển thị trong danh sách các tác vụ gần đây.
Đây hoàn toàn là câu trả lời tuyệt vời! Rất chi tiết và hoàn thành! Đây là lần đầu tiên tôi nghe nói về 'taskAffinity' đóng vai trò quan trọng với' singleTask' và 'singleInstance'. Cảm ơn bạn rất nhiều vì đã chia sẻ kinh nghiệm! – GMsoF
Nếu tôi khởi chạy hoạt động B từ A (cả từ cùng một ứng dụng và có mối quan hệ công việc mặc định), với ý định có cờ ACTIVITY_NEW_TASK, nó sẽ khởi chạy hoạt động B trong cùng nhiệm vụ như A hoặc trong tác vụ differenct? – pratim
@pratim cùng một nhiệm vụ. –