Android singleTask hay chế độ khởi chạy singleInstance? [đóng cửa]


84

Tôi có một ứng dụng có danh sách là hoạt động chính và sau đó bạn có thể nhấp vào các mục để mở ra chế độ xem chi tiết về mục đó. Tôi cũng có một hoạt động tìm kiếm tương tự như hoạt động chính và hoạt động như dự định.

Tuy nhiên, tôi muốn hoạt động tìm kiếm này chỉ có một lần trên ngăn xếp để người dùng có thể tìm kiếm nhiều lần và việc nhấp lại sẽ đưa họ trở lại chế độ xem previouse mà họ đã bật trước khi bắt đầu tìm kiếm (thay vì quay lại kết quả tìm kiếm previouse)

cả chế độ khởi chạy singleTask và singelInstance dường như làm những gì tôi muốn vì vậy tôi không chắc mình nên sử dụng chế độ nào cho mục đích này và tại sao?

Câu trả lời:


141

Từ trang Cơ bản về Ứng dụng của hướng dẫn dành cho nhà phát triển Android:

Theo mặc định, tất cả các hoạt động trong một ứng dụng đều có mối quan hệ với nhau - nghĩa là, có một ưu tiên cho tất cả chúng thuộc cùng một tác vụ.

Hoạt động "singleInstance" đứng một mình là hoạt động duy nhất trong nhiệm vụ của nó. Nếu nó bắt đầu một hoạt động khác, hoạt động đó sẽ được khởi chạy vào một nhiệm vụ khác bất kể chế độ khởi chạy của nó là gì - như thể FLAG_ACTIVITY_NEW_TASK là trong mục đích. Trong tất cả các khía cạnh khác, chế độ "singleInstance" giống với "singleTask".

Như đã lưu ý ở trên, không bao giờ có nhiều hơn một phiên bản của hoạt động "singleTask" hoặc "singleInstance", vì vậy phiên bản đó dự kiến ​​sẽ xử lý tất cả các ý định mới. Hoạt động "singleInstance" luôn ở đầu ngăn xếp (vì nó là hoạt động duy nhất trong tác vụ), vì vậy nó luôn ở vị trí để xử lý ý định. Tuy nhiên, một hoạt động "singleTask" có thể có hoặc không có các hoạt động khác phía trên nó trong ngăn xếp. Nếu có, nó không ở vị trí để xử lý ý định và ý định bị loại bỏ. (Ngay cả khi ý định bị bỏ, sự xuất hiện của nó sẽ khiến nhiệm vụ đến tiền cảnh, nơi nó sẽ vẫn còn.)

4 Hoạt động trong một Nhiệm vụ

Vì không bao giờ có nhiều hơn một phiên bản Hoạt động với một trong hai chế độ khởi chạy, nút quay lại sẽ luôn đưa bạn đến phiên bản Hoạt động hiện có trong trường hợp của bạn.

Một điểm khác biệt quan trọng là "singleTask" không yêu cầu tạo một nhiệm vụ mới cho các Hoạt động mới đang được khởi chạy khi một cái gì đó được chọn. Nó cũng không phải xóa tác vụ mới đó trên nút quay lại mỗi lần.

Vì ngăn xếp Hoạt động của bạn thực hiện tất cả liên quan đến "nhiệm vụ" của một người dùng và có vẻ như bạn không có cấu trúc Intent phức tạp trong đó singleInstance có thể có lợi khi luôn xử lý chúng, tôi khuyên bạn nên sử dụng chế độ khởi chạy singleTask.

Đây là một bài đăng blog tốt để biết thêm thông tin, cũng như được ghi nhận cho hình ảnh: Chuỗi hoạt động và nhiệm vụ của Android - Giới thiệu về mô hình thành phần giao diện người dùng của Android


4
Cảm ơn! trông giống như một bài đọc tốt ... điều tôi nhận ra là tôi thực sự MUỐN nhiều phiên bản của một hoạt động và chỉ khi hoạt động nền trước là hoạt động tìm kiếm và một tìm kiếm khác được thực hiện thì nó mới sử dụng hoạt động hiện có đó (như cách thị trường hoạt động) Và cho rằng singeTop là chính xác những gì Im sau nhưng nhờ sự giúp đỡ dù sao =) nhờ
Kman

1
Này cảm ơn nhé. Bài viết được viết tốt này đã giúp tôi rất nhiều.
icecreamman

Cảm ơn vì những chi tiết, đặc biệt là chi tiết này (Mặc dù ý định bị bỏ qua, sự xuất hiện của nó sẽ khiến nhiệm vụ đến tiền cảnh, nơi nó sẽ vẫn còn.) , Điều này ngay lập tức xóa bỏ sự bối rối của tôi. Tôi chỉ đang nghĩ về điều gì xảy ra nếu một Hoạt động nhiệm vụ đơn không ở trên cùng của ngăn xếp trong khi tôi vẫn muốn điều hướng đến nó mà không cần chỉ định FLAG_ACTIVITY_CLEAR_TOP .
neevek


30

Nói một cách đơn giản-

singleTask:

Hệ thống tạo một nhiệm vụ mới và khởi tạo hoạt động ở gốc của nhiệm vụ mới. Tuy nhiên, nếu một thể hiện của hoạt động đã tồn tại trong một nhiệm vụ riêng biệt, hệ thống sẽ định tuyến ý định đến thể hiện hiện có thông qua lời gọi onNewIntent()phương thức của nó , thay vì tạo một thể hiện mới. Chỉ one instancehoạt động có thể tồn tại tại một thời điểm.

Lưu ý: Mặc dù hoạt động bắt đầu trong một tác vụ mới, nút Quay lại vẫn đưa người dùng trở lại hoạt động trước đó.

trường hợp duy nhất-

Tương tự như vậy "singleTask", ngoại trừ việc hệ thống không khởi chạy bất kỳ hoạt động nào khác vào tác vụ đang giữ phiên bản . Hoạt động luôn là thành viên duy nhất và duy nhất trong nhiệm vụ của nó; bất kỳ hoạt động nào do cái này bắt đầu sẽ mở trong một nhiệm vụ riêng biệt .


4

singleTasksingleInstancecác hoạt động chỉ có thể bắt đầu một nhiệm vụ. Chúng luôn nằm ở gốc của ngăn xếp hoạt động. Hơn nữa, thiết bị chỉ có thể giữ một phiên bản của hoạt động tại một thời điểm - chỉ một tác vụ như vậy.
cho nhiều android hơn : khởi chạyMode .


1
câu cuối cùng là đúng đối với singleInstance, không singleTask
Serdar Samancıoğlu

@SerdarS. đánh giá cao nhận xét của bạn. Bổ sung thêm về singleTask- Hệ thống tạo một tác vụ mới và khởi tạo hoạt động ở gốc của tác vụ mới. Tuy nhiên, nếu một thể hiện của hoạt động đã tồn tại trong một nhiệm vụ riêng biệt, hệ thống sẽ định tuyến ý định đến thể hiện hiện có thông qua lời gọi onNewIntent()phương thức của nó , thay vì tạo một thể hiện mới. Chỉ một phiên bản của hoạt động có thể tồn tại tại một thời điểm. để biết thêm developer.android.com
Rupesh Yadav

Hiểu rồi, thế thì tôi đã sai. Xin lỗi đã làm phiền.
Serdar Samancıoğlu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.