2009-05-28 21 views
5

Tôi đã làm việc với Android trong hơn một năm nay, nhưng tôi vẫn gặp khó khăn trong việc xác định khi nào các loại tin nhắn/giao tiếp khác nhau giữa các quy trình/luồng nên được sử dụng. Tôi chủ yếu nói về Intents phát sóng, sử dụng AIDL cho services, sử dụng Trình xử lý để gửi tin nhắn và giao tiếp ổ cắm.Khi nào tôi nên sử dụng từng loại tin nhắn khác nhau của Android?

Nhiều công cụ trong số này có thể được sử dụng để thực hiện các tác vụ tương tự nhưng phù hợp hơn với các tình huống cụ thể?

Trả lời

14

Đây là một câu hỏi khá mở, nhưng hãy để tôi chụp ảnh mô tả cách tôi thấy giao tiếp ứng dụng nội bộ/liên kết hoạt động tốt nhất.

Một trong những khía cạnh quan trọng của nhắn tin Android là khái niệm về tất cả các thành phần ứng dụng bị ràng buộc lỏng lẻo. Bởi vì tất cả các ứng dụng đều chạy trong một tiến trình riêng biệt và một 'ứng dụng' thực sự có thể bao gồm một số ứng dụng (chịu trách nhiệm cung cấp các Hoạt động hoặc Dịch vụ khác nhau), tất cả các kỹ thuật nhắn tin đều dựa trên ý tưởng về các thông điệp marshaling trên các ranh giới quy trình.

Intents

Kỹ thuật ưa thích để nhắn tin, luôn luôn cố gắng sử dụng Intent bất cứ khi nào có thể. Đó là cách "bản địa" nhất để truyền tải thông điệp trong Android.

Ưu

Sử dụng Intents để nhắn tin duy trì ràng buộc lỏng lẻo của các thành phần ứng dụng, cho phép bạn chuyển các tin nhắn liên tục giữa nhiều ứng dụng. Mục đích được sử dụng rất nhiều trong hệ thống cốt lõi để bắt đầu các hoạt động và dịch vụ, và để phát sóng và nhận các sự kiện hệ thống.

Sử dụng tính năng bổ sung Gói bạn có thể bao gồm cặp khóa/giá trị nguyên thủy làm dữ liệu tải trọng trong Intents để dễ dàng truyền thông tin từ thành phần ứng dụng này sang thành phần khác - ngay cả khi các thành phần đó đang chạy trong các quy trình khác nhau.

Nhược

Vì Intents được thiết kế để đi giữa các quá trình, các tải trọng tính năng bổ sung chỉ hỗ trợ các kiểu dữ liệu. Nếu bạn cần gửi một đối tượng bằng cách sử dụng Intent, bạn sẽ cần phải deconstruct nó thành primitives ở một đầu và tái tạo nó ở đầu kia.

Application Lớp

Nếu bạn chỉ muốn giao tiếp trong một ứng dụng duy nhất chạy trong một quá trình duy nhất này là một giải pháp tiện dụng.

Ưu

Bằng cách mở rộng các lớp Application (và thực hiện nó như là một Singleton) bạn sẽ có được một đối tượng mà sẽ tồn tại bất cứ khi nào các thành phần ứng dụng của bạn tồn tại, cung cấp một nơi tập trung để lưu trữ và truyền dữ liệu đối tượng phức tạp giữa các thành phần ứng dụng.

Nhược

Kỹ thuật này hạn chế tin nhắn của bạn với các thành phần trong một ứng dụng duy nhất.

Dịch vụ Binding, IPC và AIDL

Ràng buộc vào một dịch vụ cho phép bạn truy cập vào các phương pháp của nó và các đối tượng trao đổi với nó. AIDL là một cách xác định làm thế nào để tuần tự hóa một đối tượng vào các nguyên bản của hệ điều hành để nó có thể được sắp xếp theo ranh giới quy trình nếu Dịch vụ mà bạn đang ràng buộc đang chạy trong một ứng dụng riêng biệt.

Ưu

Khi bạn liên kết với một dịch vụ bạn có quyền truy cập vào nó như thể nó là một đối tượng trong lớp gọi. Điều đó có nghĩa là bạn có thể thực hiện các phương thức trên Dịch vụ và trao đổi các đối tượng phong phú với nó. Lưu ý rằng nếu bạn đang ràng buộc với một Dịch vụ trong một quy trình ứng dụng khác, bạn sẽ cần tạo các định nghĩa AIDL cho Android biết cách tính toán/deserialize bất kỳ đối tượng nào bạn muốn chuyển giữa các ứng dụng.

Nhược

Tạo các lớp AIDL cho IPC là một chút công việc phụ, và ràng buộc tạo ra phụ thuộc bổ sung giữa dịch vụ và các hoạt động có thể làm cho nó khó khăn hơn cho các hạt nhân để làm sạch nguồn khi các ứng dụng khác đang được đói.

Thông điệp khắc phục trên các ranh giới quá trình là tốn kém. Vì vậy, nếu bạn không thực hiện các phương thức trên một Dịch vụ, việc sử dụng ràng buộc và IPC có thể là quá mức cần thiết - hãy xem bạn có thể đạt được điều tương tự bằng cách sử dụng Intents hay không.

Sockets

Nếu bạn đang phải dùng đến ổ cắm để giao tiếp trong hoặc giữa các ứng dụng đang chạy trên một thiết bị duy nhất, nó là một trong hai vì không có cách nào khác hoặc bạn đã bỏ lỡ một thủ thuật nào đó. Nếu tin nhắn của bạn đang rời khỏi thiết bị thì ổ cắm là một lựa chọn tốt, nhanh chóng, thay thế. Nếu bạn đang ở trên cơ hội thiết bị là Intents hoặc IPC sẽ là một lựa chọn tốt hơn.

+0

+1 đây là câu trả lời lý tưởng có thể được sử dụng làm câu trả lời tiêu chuẩn trên toàn cộng đồng ..... – aProgrammer

1

2 cent Mỹ

  • Tôi đã không được sử dụng ổ cắm địa phương. Có vẻ như quá mức cần thiết vì bạn phải tạo và phân tích cú pháp dữ liệu.
  • Intents là dành cho một trong hai điều mà các ứng dụng khác có thể muốn làm (ra mắt tôi trong một cửa sổ soạn thảo hoặc để chọn một cái gì đó)
  • AIDL/Bưu kiện/Handlers để có một cuộc nói chuyện GUI để một quá trình không đầu mà đang chạy liên tục. Tùy thuộc vào ứng dụng rất nhiều dữ liệu thực tế chuyển có thể xảy ra khi sử dụng nhà cung cấp nội dung nhưng tôi có xu hướng có một số dữ liệu cần được chuyển bên ngoài của kênh đó.
2

Tất cả đều phụ thuộc vào trường hợp sử dụng và loại ứng dụng của bạn.Nếu ứng dụng đang chạy tất cả các thời gian tốt hơn để đi với cách tiếp cận AIDL vì nó là cách an toàn nhất để giao tiếp. Nếu ứng dụng không cần chạy mọi lúc, bạn có thể đi với mục đích phát sóng hoặc phương pháp tiếp cận cố ý để giao tiếp giữa các ứng dụng.

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