2010-03-19 7 views
7

Tôi đang làm việc để thiết lập liên lạc hai chiều giữa Hoạt động và Dịch vụ chạy trong một quy trình khác.Làm thế nào để thiết lập một giao tiếp hai chiều giữa Hoạt động và Dịch vụ trong quá trình khác nhau?

Truy vấn quy trình từ Hoạt động không phải là vấn đề lớn. Nhưng tôi muốn quy trình thông báo cho Hoạt động về các sự kiện. Ý tưởng đằng sau nó là: dịch vụ chạy độc lập với ứng dụng thực tế. Nó truy vấn một máy chủ web định kỳ. Nếu một nhiệm vụ mới được tìm thấy trên máy chủ web, quy trình sẽ thông báo cho hoạt động.

Tôi đã tìm thấy this thread qua tại AndDev.org nhưng dường như nó không hoạt động đối với tôi. Tôi đã rối tung với BroadcastReceiver. Tôi đã thực hiện một giao diện mà nên thông báo cho Activity nhưng vấn đề là người nghe luôn luôn null kể từ khi Broadcast từ quá trình được thực hiện thông qua Intent, do đó lớp mở rộng BroadcastReceiver sẽ được khởi tạo mới.

Làm cách nào để thiết lập liên lạc 2 chiều? Điều này là có thể. Nhờ sự giúp đỡ,

Steff

+0

Bạn có thể nêu chi tiết cách "truy vấn quy trình từ Hoạt động không phải là vấn đề lớn"> Chính xác bạn làm như thế nào? Bạn có bị ràng buộc với dịch vụ không? – Radu

Trả lời

4

Hoặc sử dụng BroadcastReceiver hoặc có Activity register a callback or listener object rằng các cuộc gọi Service về các sự kiện chính. Các liên kết ở trên là để đặt các dự án ví dụ thể hiện từng kỹ thuật đó.

+0

Tôi có thể sử dụng BroadcastReceiver bên trong Hoạt động của mình hay tôi phải tạo một lớp khác? Tôi có phải chỉ định lớp mở rộng BroadcastReceiver cho mục đích này không? – stfn

+0

'BroadcastReceiver' là một lớp - một lớp không thể vừa là' Hoạt động' và 'BroadcastReceiver'. Bạn có thể sử dụng một lớp bên trong 'Activity' của bạn cho' BroadcastReceiver', như được thể hiện trong mã mẫu được liên kết ở trên. Bạn có thể sử dụng các tên thành phần cho phát sóng 'Intents', nhưng điều này đòi hỏi một lớp' BroadcastReceiver' công khai. Hoặc bạn có thể sử dụng chuỗi hành động tùy chỉnh, như được minh họa trong mã mẫu được liên kết ở trên. – CommonsWare

+0

Cảm ơn, nhưng tôi không thực sự chắc chắn nếu một BroadcastReceiver là rất phù hợp vì những gì tôi muốn là một quá trình chạy càng lâu càng tốt mà là độc lập với các ứng dụng thực tế. Nó sẽ có thể hiển thị một thông báo trên thanh trạng thái giống như một email mới, ngay cả khi ứng dụng thực tế không chạy. Vì vậy, điều này có nghĩa là tôi phải bắt đầu một dịch vụ thông qua startService (intent) thay vì bindService (intent, connection, flags), phải không? Tôi đã cố gắng để hiểu 'RemoteServiceClient' ApiDemos 'nhưng pathetically thất bại.Tôi càng nhìn vào 'ví dụ', tôi càng cảm thấy bối rối ... – stfn

2

Tôi nghĩ bạn nên có BroadcastReceiver bắt đầu hoạt động của bạn một lần nữa với kết quả trong tiếp cận mục đích.

Hoặc bạn có thể sử dụng AIDL về AIDL. Các mẫu cũng có một ví dụ (nhiều?) Cách sử dụng AIDL và các dịch vụ. Nhưng AIDL có thể gây ra nhiều rắc rối cho mục đích của bạn.

+0

... Bắt đầu hoạt động của tôi NÂNG CẤP? Đây là những gì tôi đang cố gắng tránh ... AIDL thực sự là một rắc rối nhưng có vẻ như là con đường để đi. Tôi hiện đang cố gắng hiểu RemoteServiceBinding từ ApiDemos. Một khó khăn. – stfn

2

Bạn phải sử dụng BroadcastReceiver để nhận ý định và khi bạn muốn liên lạc, chỉ cần tạo Mục đích với các giá trị thích hợp.

Bằng cách này, bạn sẽ có thể thực hiện liên lạc 2 chiều giữa bất kỳ thành phần nào.

+0

Bạn có thể nêu chi tiết câu trả lời này không? Vì vậy, bạn thực hiện một BroadcastReceiver trong dịch vụ và một số khác trong hoạt động này? Và gửi Intents từ cả hai phía? Ngoài ra, tôi có thể sử dụng LocalBroadcastReceiver thay vì BroadcastReceiver? – Radu