2015-05-19 21 views
18

Tôi đã trải qua Bound Service trong trang web dành cho nhà phát triển Android. Tôi nghĩ rằng tôi hiểu dịch vụ đủ nhưng tôi chỉ tìm thấy một cách khác để kết nối dịch vụ thông qua Sử dụng một lớp Messenger đặc biệt là cho dịch vụ địa phương. Ở đó tôi đã bối rối. Có lẽ tôi đã có khái niệm sai.Tại sao lại sử dụng Dịch vụ nếu nó chạy trong cùng một chuỗi trong android

Đây là hiểu biết của tôi về Dịch vụ Android. Bạn tạo một dịch vụ khi

  1. Bạn muốn thực hiện các công việc riêng biệt trong nền.
  2. Bạn muốn tạo quy trình riêng biệt.
  3. Bạn muốn làm cho nó chạy trên vòng đời khác nhau.

Lẫn lộn là mục đầu tiên trong danh sách, định nghĩa nền. Không phải là nền một sợi hoặc quá trình? Tôi không bao giờ nghĩ rằng nó có thể chạy trên thread chính.

Đây là dịch vụ cảnh báo trong các trang về dev.

Thận trọng: Một dịch vụ chạy trong các chủ đề chính của lưu trữ của nó quá trình dịch vụ không tạo ra thread riêng của mình và không chạy trong một quá trình riêng biệt (trừ khi bạn chỉ định khác). Điều này có nghĩa là, nếu dịch vụ của bạn sẽ thực hiện bất kỳ thao tác hoặc thao tác chặn CPU nào (chẳng hạn như phát lại hoặc kết nối MP3), bạn nên tạo một chuỗi mới trong dịch vụ để thực hiện công việc đó. Bằng cách sử dụng một chuỗi riêng biệt, bạn sẽ giảm nguy cơ lỗi ứng dụng không trả lời (ANR) và chủ đề chính của ứng dụng có thể vẫn dành riêng cho tương tác của người dùng với các hoạt động của bạn.

Câu hỏi 1. Tại sao người ta chọn sử dụng dịch vụ nếu chức năng dịch vụ vẫn chạy trên luồng chính? 2. Chúng ta phải viết một dịch vụ chỉ để chặn ANR ngay cả khi công việc tốn thời gian được thực hiện trong chủ đề chính? Giả sử dịch vụ chỉ dành cho ứng dụng của tôi. 3. Có bất kỳ trường hợp hoặc lý do thực tế nào sử dụng dịch vụ là riêng tư và đang chạy trong cùng một luồng không?

Xin cảm ơn trước.

+1

mục đích chính của dịch vụ là chúng có chu kỳ sống khác với vòng đời hoạt động của bạn - vì vậy # 3 áp dụng tại đây. – pskink

Trả lời

17

Chủ đề chính của ứng dụng không phải lúc nào cũng là chuỗi giao diện người dùng. Ví dụ, khi hoạt động được dừng lại, onStop() được gọi, do đó thread UI được lấy ra khỏi hoạt động đó và chuyển đến một hoạt động khác trong cùng một ứng dụng hoặc một ứng dụng khác. Tuy nhiên nó không có nghĩa là ứng dụng không còn hoạt động nữa, nó có thể tiếp tục hoạt động ở chế độ nền cho đến khi ứng dụng bị đóng hoặc bởi hệ điều hành hoặc bởi người dùng. Sau đó, những người giữ nó chạy trong nền? Đây là chủ đề chính chứ không phải là chuỗi giao diện người dùng.

dịch vụ

Trong Android là gì, một dịch vụ là một thành phần ứng dụng có thể thực hiện hoạt động lâu dài trong nền trên thread UI. Bởi nền, điều đó có nghĩa là nó không có giao diện người dùng. Dịch vụ chạy trên luồng chính của quy trình của Thành phần gọi theo mặc định (và do đó có thể làm giảm phản hồi và gây ANR), do đó bạn nên tạo Chủ đề mới để thực hiện các hoạt động dài. Dịch vụ cũng có thể được thực hiện để chạy trong một quy trình hoàn toàn khác.

Không giống như thành phần Hoạt động, Dịch vụ không có bất kỳ giao diện đồ họa nào . Ngoài ra Broadcast Receivers là để nhận các tin nhắn phát sóng (broadcast, multicast, unicast) và thực hiện các tác vụ ngắn trong khi Dịch vụ có nghĩa là xử lý dài dòng như phát trực tuyến âm nhạc, giao dịch mạng, tệp I/O, tương tác với cơ sở dữ liệu, v.v. một dịch vụ được bắt đầu bởi một thành phần ứng dụng như một hoạt động nó chạy ở chế độ nền và tiếp tục chạy ngay cả khi người dùng bật để ứng dụng khác hoặc các thành phần khởi động là chính nó bị phá hủy

tại sao dịch vụ sử dụng

Dịch vụ được ưu tiên cao hơn các quy trình nền khác và do đó ít khả năng Android sẽ chấm dứt nó. Mặc dù nó có thể được định cấu hình để khởi động lại khi có nhiều tài nguyên có sẵn một lần nữa. Bạn nên đi qua các quy trình khác nhau và mức độ ưu tiên/quan trọng của họ trong tài liệu về quy trình và các chủ đề . Việc gán cho họ mức độ ưu tiên giống như hoạt động tiền cảnh là chắc chắn có thể xảy ra trong trường hợp đó, cần có thông báo hiển thị (thường được sử dụng cho Dịch vụ phát nhạc).

Sử dụng IntentService nếu bạn không muốn tự lo việc quản lý chủ đề. Nếu không, hãy sử dụng AsyncTasks.

Vui lòng đọc bài viết tuyệt vời này để understand more in detail và cũng read this answer.

+0

Tôi có điểm tôi nghĩ. Chúng cơ bản là các mục đích khác nhau (Độ nhạy chỉ cho bối cảnh ngắn (màn hình) và dịch vụ rộng hơn) và không hữu ích khi phân biệt chúng về hiệu suất vì dịch vụ vẫn chạy trên luồng chính. – Jaekwan

+0

Theo https://stackoverflow.com/questions/3261370/is-main-thread-the-same-as-ui-thread chủ đề chính và chuỗi ui giống nhau – 10101010

0

Tóm lại, Dịch vụ chạy trên nền của chuỗi giao diện người dùng. Bạn có thể thực hiện các tác vụ như xác thực máy khách-máy chủ hoặc ghi vào cơ sở dữ liệu nơi các tác vụ được thực hiện trong nền mà không có giao diện đồ họa.

Nhưng nếu bạn đang thực hiện các tác vụ xử lý thực sự dài có thể đóng băng giao diện, bạn sử dụng dịch vụ trên một chuỗi riêng biệt.

ví dụ: Dịch vụ trên một sợi riêng biệt là IntentService

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