2012-11-01 25 views

Trả lời

33

quả Receiver:

Generic interface for receiving a callback result from someone. 

Broadcast Receiver:

Base class for code that will receive intents sent by sendBroadcast(). 

EDIT:

Bối cảnh: Tất cả các hoạt động mạng/dài hoạt động chạy nên diễn ra cách xa chủ đề chính. Hai cách để làm điều này:

  1. Async nhiệm vụ - Đối với mạng đơn giản như nói truy xuất hình ảnh/làm db chế biến
  2. Dịch vụ - Đối với quá trình nền Complex dài chạy

Nếu bạn cần phải thực hiện làm việc bên ngoài chủ đề chính của bạn, nhưng chỉ khi người dùng tương tác với ứng dụng của bạn, thì có lẽ bạn nên tạo một chuỗi mới chứ không phải một dịch vụ. Ví dụ: nếu bạn muốn phát một số bản nhạc nhưng chỉ khi hoạt động của bạn đang chạy, bạn có thể tạo một Chủ đề không đồng bộ. Nhưng nếu bạn muốn quá trình này tiếp tục ngay cả sau khi người dùng thoát khỏi ứng dụng (chẳng hạn một download) sau đó sử dụng một dịch vụ

Cho phép nói rằng bạn chọn 2. Bây giờ

  1. Bạn hoạt động gửi một yêu cầu web dịch vụ của bạn
  2. Dịch vụ của bạn thực hiện bằng cách sử dụng nói DefaultHttpClient
  3. Nó sẽ gửi lại dữ liệu cho hoạt động của bạn.

    Bước thứ ba nhận dữ liệu ở đây có thể được thực hiện theo hai cách

1.) Broadcast receiver: Nhiều người nhận có thể nhận được dữ liệu của bạn. Được sử dụng nếu bạn muốn gửi dữ liệu/thông báo trên các ứng dụng (nói rằng bạn cũng đang tương tác với fb và twitter, nhiều người nhận để phát trên web), bất cứ khi nào bạn gửi phát rộng hệ thống đã gửi.

2.) Bộ thu kết quả: Ứng dụng của bạn là người nhận dữ liệu duy nhất. Nó là một Giao diện mà bạn triển khai và chuyển nó tới intentService thông qua putExtra. IntentService sau đó sẽ tìm đối tượng này và gọi hàm receive.send của nó để gửi bất kỳ thứ gì (trong gói) đến hoạt động gọi điện.Kết quả thu có ưu tiên hơn thu phát sóng nếu tất cả các thông tin liên lạc của bạn là nội bộ để ứng dụng của bạn

EDIT: Tôi cũng nên đề cập đến thận trọng này

Thận trọng: Một dịch vụ chạy trong các chủ đề chính của quy trình lưu trữ của nó — dịch vụ không tạo chủ đề riêng và không chạy trong quy 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ỳ hoạt động hoặc hoạt động chặn nào của CPU (chẳng hạn như phát lại hoặc kết nối MP3), bạn nên tạo một chủ đề mới trong dịch vụ để thực hiện công việc đó. Bằng cách sử dụng một sợi riêng biệt, bạn sẽ giảm nguy cơ lỗi ứng dụng không ứng phó (ANR) và luồng chính của ứng dụng có thể vẫn dành riêng cho tương tác người dùng với các hoạt động của bạn.

+0

Cái nào là tốt nhất cho quá trình nối mạng dài? Ví dụ: Tải xuống tệp, phân tích cú pháp JSON.etc – user1670564

+0

Xem câu trả lời hàng đầu tại đây: http://stackoverflow.com/questions/3197335/restful-api-service để hiểu mô hình dịch vụ thu + kết quả. Nó cung cấp cho một trường hợp sử dụng thực sự tốt của ứng dụng – Slartibartfast

+0

Cảm ơn bạn đã trả lời. Tôi đã đi qua liên kết. Một khi vượt qua liên kết tôi có nghi ngờ trong cả hai người nhận. Cả hai bộ thu đều hỗ trợ các tác vụ chạy dài. Ở tình huống nào tôi cần sử dụng Broadcast và kết quả. – user1670564

3

Hai lớp này là hoàn toàn khác nhau. Đó thực sự là sự khác biệt giống như giữa Phát sóngKết quả.

  • nội dung phát sóng? Nói một cách đơn giản, đó là một số thông điệp có thể nhìn thấy toàn bộ hệ thống và nó có thể được tiêu thụ bởi mọi phần của hệ thống (mà biết hợp đồng), nó không có nguồn gốc từ smb reuest;
  • Kết quả là gì? Đó là điều chúng tôi mong đợi nhận được từ một phần khác của hệ thống. Thông thường chỉ có một người nhận cho kết quả và thường người nhận đã yêu cầu xử lý để có được kết quả (cảm thấy sự khác biệt - đối với phát sóng không ai cần phải làm bất kỳ 'yêu cầu' để cho nó có nguồn gốc);

Đó là giải thích từ quan điểm logic. Từ quan điểm mã nếu bạn sẽ so sánh BroadcastReceiver và ResultReceiver Bạn có thể quan sát sự khác biệt rất lớn. Về cơ bản cả hai lớp được xây dựng trên đầu trang của IPC nhưng BroadcastReceiver phức tạp hơn nhiều vì nó là bản chất khác nhau (mà tôi đã cố gắng giải thích ở phần đầu).

+0

Wheteher cả hai người nhận đều có thể hỗ trợ yêu cầu và phản hồi HTTP Async ? – user1670564

+0

hm, tôi nghĩ không, bởi vì cả hai đều không phải về yêu cầu HTTP. Nếu bạn cần, bạn có thể gửi kết quả từ dịch vụ của bạn hoặc tác vụ không đồng bộ bằng cách sử dụng bất kỳ công cụ nào trong số đó. Nhưng đối với AsyncTask Bạn chỉ có thể sử dụng Handler. – sandrstar

8

BroadcastReceiver là người nhận nhận chương trình phát sóng. Những người được gửi bởi một ai đó trong ý định rằng có thể có nhiều người nhận nhận được chúng (như chương trình phát thanh).

Mặt khác, trình nhận kết quả nhằm nhận kết quả gọi lại từ một người nào đó. Vì vậy, điều này có thể được so sánh với một walkie talkie, nơi bạn gọi một ai đó và sau đó sẽ nhận được một câu trả lời (một kết quả) từ một trong những bạn gọi.

+0

Cảm ơn bạn đã trả lời! Ví dụ hay để hiểu ... – user1670564

0

Broadcast Receiver

Một máy thu phát sóng là một thành phần phản ứng với thông báo phát sóng trên toàn hệ thống. ví dụ, một phát sóng thông báo rằng màn hình đã tắt, pin yếu hoặc chụp ảnh. Các ứng dụng cũng có thể khởi tạo chương trình phát sóng — ví dụ, để cho các ứng dụng khác biết rằng một số dữ liệu đã được tải xuống thiết bị và có sẵn để chúng sử dụng. Mặc dù máy thu phát không hiển thị giao diện người dùng, họ có thể tạo thông báo trên thanh trạng thái để cảnh báo người dùng khi sự kiện phát sóng xảy ra. Hơn nữa, mặc dù, một máy thu phát sóng chỉ là một "cửa ngõ" cho các thành phần khác và được dự định để làm một số lượng rất tối thiểu của công việc. Ví dụ, nó có thể bắt đầu một dịch vụ để thực hiện một số công việc dựa trên sự kiện này.

quả Receiver

Nếu dịch vụ của bạn sẽ trở thành một phần của bạn ứng dụng sau đó bạn đang làm nó theo cách phức tạp hơn nó cần phải được. Vì bạn có trường hợp sử dụng đơn giản để nhận một số dữ liệu từ Dịch vụ web an toàn, bạn nên xem xét ResultReceiverIntentService.

Mẫu ServiceReceiver + Service này hoạt động bằng cách bắt đầu hoặc liên kết với dịch vụ bằng startService() khi bạn muốn thực hiện một số hành động. Bạn có thể chỉ định hoạt động để thực hiện và truyền trong ResultReceiver của bạn (hoạt động) thông qua các tính năng bổ sung trong Intent.

+0

Thay vì AsyncTask, tôi có sử dụng cuộc gọi webservice Async này không? – user1670564

+0

Bạn có thể nên ghi có vào các từ bạn sao chép + dán từ Robby Pond tại đây: http://stackoverflow.com/a/3197456/1738090 – w3bshark

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