2013-09-04 28 views
8

Tôi đã đọc qua trang Nhà phát triển Android của Google, nhưng khái niệm về nhiệm vụ (http://developer.android.com/guide/components/tasks-and-back-stack.html) thực sự gây nhầm lẫn cho tôi.Nhiệm vụ và quy trình Android, SingleTask và SingleInstance

Sau khi tôi đọc cho đến khi SingleTask và SingleInstance, tôi thấy bối rối hơn.

Tôi muốn hỏi một số câu hỏi bằng cách sử dụng các ví dụ, hy vọng rằng tôi sẽ có sự hiểu biết tốt hơn từ những câu hỏi:

Hãy nói rằng tôi có 2 ứng dụng A và B, A có x, y, hoạt động z; B có 1, 2, 3 hoạt động:

Giả sử chế độ khởi chạy của chúng là Chuẩn (Không sử dụng bất kỳ cờ ý định nào). 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 Một lần nữa, chúng ta sẽ thấy hoạt động y hoặc 1?

2) Khởi chạy ứng dụng Sau đó x -> 1 -> y -> 2 -> z -> 3, nhấn nút Home, khởi chạy ứ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? Làm thế nào về nếu chúng ta khởi động ứng dụng B bây giờ? B sẽ chứa những hoạt động nào?

Bây giờ, hãy nói hoạt động 1, 2, 3 là SingleTask; x, y, z vẫn chuẩn:

3) Khởi chạy ứng dụng A, sau đó x -> y -> 1 -> 2, nhấn nút home, ra mắt ứng dụng A, nó sẽ chứa x -> chỉ y hoặc nó chứa x -> y -> 1 -> 2? Làm thế nào về nếu chúng ta khởi động ứng dụng B bây giờ? ứng dụng B sẽ chỉ chứa 1 hoặc 1 -> 2?

4) Khởi chạy ứng dụng B, sau đó 1 -> 2 -> 3 -> 1, 2 và 3 sẽ bị hủy không?

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 A now, then x -> y -> 2 rồi nhấn nút quay lại để thả 2. Khởi chạy ứng dụng B ngay bây giờ , hoạt động của nó chứa gì? 1 -> 3 chỉ hoặc 1 -> 2 -> 3?

Cảm ơn mọi người đã trả lời và trợ giúp!

Trả lời

16

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 2launchMode="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 12 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. 23 sẽ không bị hủy. Giả sử rằng 1, 23 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.

+1

Đâ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

+0

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

+0

@pratim cùng một nhiệm vụ. –

Các vấn đề liên quan