2010-06-15 37 views
11

Tôi đã cố gắng để có được mục đích của IntentService và khi nào tôi nên sử dụng?Giải thích thêm về IntentService

Tôi đã cố gắng hiểu từ API nhưng không đủ chi tiết về API đó.

Có sự tương tự nào giữa điều này và chạy tác vụ dài trên một chuỗi hoạt động không?

Bất kỳ giải thích và mẫu nào khác về lý do tôi sẽ sử dụng IntentService sẽ rất được hoan nghênh.

Xin cảm ơn,

ray.

Trả lời

13

Có sự tương tự nào giữa điều này và chạy tác vụ dài trên một chuỗi hoạt động không?

IntentService xử lý chỉ cho bạn.

khi nào tôi nên sử dụng?

Một số trường hợp sử dụng:

  • Đối xử lý báo động kích hoạt bởi AlarmManager
  • Đối với việc xử lý các sự kiện khác bị bắt bởi một biểu hiện đăng ký BroadcastReceiver
  • Đối với việc xử lý các sự kiện kích hoạt bởi một widget ứng dụng (tốn nhiều thời gian cập nhật dựa trên, nhấp chuột vào nút, v.v.)
+0

Tại sao tôi sử dụng IntentService tốt hơn để "xử lý cảnh báo được kích hoạt bởi AlarmManager/BroadcastReceiver đã đăng ký manifest", những gì nó có thể làm Dịch vụ thông thường sẽ không thể? – rayman

+0

@rayman: nó xử lý chuỗi nền và hàng đợi công việc cho bạn. – CommonsWare

+0

Tôi nghĩ rằng tôi đã nhận nó, nhưng mybe bạn biết một số ví dụ tôi có thể kiểm tra, vì vậy tôi có thể thấy sự khác biệt nhỏ giữa việc sử dụng nó hay không? cảm ơn. – rayman

2

Dịch vụ Android là workhorses của nền tảng. Chúng cho phép các ứng dụng chạy các tác vụ chạy dài và cung cấp chức năng cho các ứng dụng bên ngoài. Thật không may, kể từ khi họ chạy trong nền và không trực quan rõ ràng cho các nhà phát triển, họ có thể là một nguồn nhức đầu lớn. Nếu bạn đã thấy ANR (hoạt động không phản hồi) hoặc đã tự hỏi tại sao một dịch vụ đang chạy khi không nên, dịch vụ được triển khai kém có thể là vấn đề.

ANR sợ hãi Hãy xem hai dịch vụ lỗi chính gây ra: ANR. Điều này làm gián đoạn trải nghiệm của người dùng và cung cấp cho người dùng tùy chọn để buộc đóng. Điều này có thể dẫn đến việc người dùng gỡ cài đặt ứng dụng của bạn hoặc quá trình nền đang ở trạng thái bị gián đoạn. Lý do cho điều này là các dịch vụ được khởi chạy từ chuỗi cuộc gọi của bạn-- thường đây là luồng giao diện người dùng. Luôn chạy dịch vụ. Mặc dù Android cung cấp các cơ chế để lên lịch và dừng dịch vụ, nhưng không phải tất cả các nhà phát triển đều tuân thủ các nguyên tắc này. Trong thực tế, rất nhiều ví dụ tôi đã thấy thậm chí không đề cập đến việc dừng dịch vụ của bạn. Điều này có thể dẫn đến hiệu suất tổng thể chậm hơn, sự nhầm lẫn của người dùng và mức tiêu hao pin. Tôi tưởng tượng các nhà phát triển Android tại Google thấy rằng điều này đã trở thành một vấn đề và giới thiệu lớp IntentService trong Android 1.5. Lớp IntentService giải quyết các vấn đề trên và tóm tắt tất cả việc quản lý các luồng và dịch vụ dừng lại từ nhà phát triển. Nó rất dễ dàng và mạnh mẽ của các nhiệm vụ offloading từ chủ đề chính của ứng dụng.

0

Tôi sẽ sử dụng nó bất cứ khi nào trường hợp sử dụng là một tác vụ cụ thể sẽ mất nhiều thời gian nhưng có kết thúc thường xuyên.Ví dụ, trường hợp sử dụng đánh vần về ở trên và cũng nhiệm vụ thường xuyên như vậy như: -syncing -downloading nguồn -pulling dữ liệu từ nhiều nguồn khác nhau và lưu trữ chúng

tôi sẽ không khuyên bạn nên sử dụng nó khi dịch vụ có chiều dài chạy trong tự nhiên và không có một kết thúc nhất định. Tôi đã thấy điều này được thực hiện và đó là một sai lầm vì cách mọi người cuối cùng nhận được xung quanh thực tế là IntentService dừng chính nó là tạo khóa để giữ handleIntent hoàn thành hoặc nếu họ không muốn chặn các yêu cầu tiếp theo trong dòng, chúng sẽ tự khởi động lại bằng cách gửi lại startService cho chính chúng. Điều này là khủng khiếp và đối với các loại kịch bản, bạn chỉ nên sử dụng một dịch vụ Android thường xuyên chạy dài và chắc chắn rằng nó bị ràng buộc (có thể AUTO_CREATE) và xử lý công việc ra khỏi chủ đề chính.