2010-07-10 25 views
81

Tôi có một ứng dụng có danh sách là hoạt động chính của nó và sau đó bạn có thể nhấp vào các mục mở ra chế độ xem chi tiết của 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.Chế độ khởi chạy singleTask hoặc singleInstance trên Android?

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à nhấp lại sẽ quay lại chế độ xem trước khi họ bắt đầu tìm kiếm (thay vì quay lại previouse search results)

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 cái nào cho mục đích này và tại sao?

Trả lời

139

Từ Application Fundamentals trang của hướng dẫn dev Android:

Theo mặc định, tất cả các hoạt động trong một ứng dụng có một mối quan hệ đối với từng khác - có nghĩa là, có một sở thích cho họ tất cả để thuộc cho cùng một nhiệm vụ .

Hoạt động "singleInstance" là viết tắt một mình như 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 đưa vào một nhiệm vụ khác nhau bất kể chế độ khởi chạy của nó - như thể FLAG_ACTIVITY_NEW_TASK ở mục đích . Trong tất cả các khía cạnh khác, chế độ "singleInstance" giống hệt với "singleTask".

Như đã đề cập ở trên, không bao giờ có nhiều hơn một ví dụ của một "singleTask" hoặc "singleInstance" hoạt động, do đó dụ dự kiến ​​sẽ xử lý tất cả ý đồ mới. Hoạt động "singleInstance" luôn ở trên cùng của ngăn xếp (vì đây là hoạt động duy nhất trong nhiệm vụ ), do đó, luôn ở vị trí xử lý ý định. Tuy nhiên, hoạt động "singleTask" có thể hoặc không thể 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à mục đích bị xóa. (Mặc dù ý định được giảm xuống, xuất hiện của nó sẽ đã gây ra nhiệm vụ đến các foreground, nơi nó sẽ vẫn còn.)

4 Activities in a Task

Vì không bao giờ nhiều hơn một thể hiện của Hoạt động với 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 tại trong trường hợp của bạn.

Sự khác biệt quan trọng là "singleTask" không yêu cầu tạo tác vụ mới cho các Hoạt động mới được khởi chạy khi một thứ được chọn. Cũng sẽ không phải xóa nhiệm 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 có liên quan đến một "nhiệm vụ" của người dùng và có vẻ như bạn có cấu trúc Intent intentate trong đó singleInstance có thể có lợi để 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 viết trên blog tốt để biết thêm, cũng như ghi cho hình ảnh: Android Activities and Tasks series – An introduction to Android’s UI component model

+3

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

+1

Hey, cảm ơn. Bài viết được viết tốt này đã giúp tôi một chút. – icecreamman

+0

Cảm ơn các chi tiết, đặc biệt là cái này * (Mặc dù ý định bị rơi, sự xuất hiện của nó sẽ khiến nhiệm vụ tiến lên phía trước, nơi nó sẽ ở lại.) *, Ngay lập tức xóa bỏ sự nhầm lẫn của tôi. Tôi đã chỉ nghĩ về việc nếu một hoạt động singleTask 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 chỉ rõ 'FLAG_ACTIVITY_CLEAR_TOP'. – neevek

4

singleTasksingleInstance hoạt động chỉ có thể bắt đầu một nhiệm vụ. Chúng luôn ở 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 hoạt động tại một thời điểm - chỉ một nhiệm vụ như vậy.
để biết thêm android:launchMode.

+0

câu cuối cùng là đúng cho singleInstance, không phải là singleTask –

+0

@SerdarS. đánh giá cao nhận xét của bạn. Thêm nhiều hơn về 'singleTask' - Hệ thống tạo một nhiệm vụ mới và khởi tạo hoạt động ở thư mục gốc của tác vụ mới. Tuy nhiên, nếu một cá thể 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 tới cá thể hiện có thông qua một lời gọi tới phương thức 'onNewIntent()' của nó, thay vì tạo một cá thể mới. Chỉ một thể hiện của hoạt động có thể tồn tại cùng một lúc. để biết thêm [developer.android.com] (https://developer.android.com/guide/components/activities/tasks-and-back-stack.html) –

+0

OK, vậy thì tôi đã sai. Xin lỗi đã làm phiền. –

27

Trong một gì theo cách đơn giản

singleTask:

Hệ thống này tạo ra một nhiệm vụ mới và instantiates hoạt động tại thư mục gốc của nhiệm vụ mới. Tuy nhiên, nếu một cá thể 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 cá thể hiện có thông qua một cuộc gọi đến phương thức onNewIntent() của nó, thay vì tạo một cá thể mới. Chỉ có thể tồn tại one instance hoạt động tại một thời điểm.

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

singleInstance-

Tương tự như "singleTask", ngoại trừ hệ thống không khởi chạy bất kỳ hoạt động khác vào nhiệm vụ giữ dụ. Hoạt động này 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 bắt đầu bởi hoạt động này mở trong một nhiệm vụ riêng biệt.

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