2012-01-09 3 views
36

Tôi có Hoạt động và Dịch vụ. Khi Bắt đầu hoạt động, nó gọi số startService() để làm cho Dịch vụ này hoạt động ngay cả khi Hoạt động bị hủy và bindService(), để liên lạc với Dịch vụ này.Dịch vụ Android: onBind (Intent) và onUnbind (Intent) được gọi chỉ một lần

bindService() trả về true, mService.onBind() được gọi và ServiceConnection.onServiceConnected() cũng được gọi. Tất cả các công việc.

Khi tôi hủy Hoạt động của mình bằng cách bấm phím Quay lại, nó gọi số unbindService() và số mService.onUnbind() của tôi được gọi. (I trở false trong onUnbind() này.)

Sau đó, tôi bắt đầu Hoạt động này một lần nữa, bindService() trả về true, và sau đó mService.onBind()KHÔNG gọi! Nhưng ServiceConnection.onServiceConnected() được gọi là quá, và tất cả các công trình một lần nữa.

Dường như Dalvik nhớ nội dung của tôi onBind() đã trả lại lần cuối và không gọi lại onBind(). Khi tôi hủy Hoạt động của mình lần nữa, onUnbind()NOT cũng được gọi.

Tôi có thể liên kết và hủy liên kết Dịch vụ này với Hoạt động của tôi bất kỳ số lần nào, nhưng các phương pháp này sẽ không được gọi nữa cho đến khi tôi hủy Dịch vụ bằng cách hủy liên kết và gọi stopService().

Trong tài liệu tôi không thể tìm thấy bất kỳ giải thích nào về hành vi này. Ngược lại, this figure cho thấy rằng onBind()onUnbind() nên được gọi mỗi khi khách hàng ràng buộc và hủy liên kết Dịch vụ. Con số này có thể được tìm thấy ở dưới cùng của this Dev Guide.

Trả lời

47

Tôi nghĩ this (tham chiếu từ hướng dẫn dev chính thức) có thể giải thích tất cả các thắc mắc của bạn:

Nhiều khách hàng có thể kết nối với dịch vụ cùng một lúc. Tuy nhiên, hệ thống gọi phương thức onBind() của dịch vụ của bạn để truy xuất IBinder chỉ khi máy khách đầu tiên liên kết. Hệ thống sau đó cung cấp cùng một IBinder cho bất kỳ khách hàng bổ sung nào ràng buộc, mà không cần gọi lại onBind() một lần nữa.

+21

oh cảm ơn. Tôi đã bỏ lỡ điều này, thật không may. Tuy nhiên, tôi phát hiện ra rằng tôi có thể trả về true trong 'onUnbind()', và sau đó 'onRebind()' và 'onUnbind()' sẽ được gọi cho máy khách tiếp theo. –

+18

Tài liệu thực sự gây hiểu lầm. Nó nói rằng không có nhiều cuộc gọi đến 'onBind()' được thực hiện, nhưng điều này chỉ áp dụng cho trường hợp của nhiều máy khách. Tài liệu cũng nói rằng "nếu dịch vụ của bạn được bắt đầu và chấp nhận ràng buộc, thì khi hệ thống gọi phương thức onUnbind() của bạn, bạn có thể trả về true nếu bạn muốn nhận cuộc gọi đến onRebind() trong lần tiếp theo khách hàng liên kết với dịch vụ (** thay vì nhận cuộc gọi đến onBind() **) ". Chỉ có không có cuộc gọi đến 'onBind()'. Tuy nhiên, một trường hợp khác khi tài liệu là sai. – Malcolm

+0

xin lỗi vì đã gặp phải @Malcolm ... tôi có câu hỏi liên quan đến công cụ Binding và unBinding đó.Điều gì xảy ra nếu tôi đặt một ServerSocket Thread bên trong Service đó, và trong Activity-A tôi đặt onStart() và onStop() với binding và unbinding cho phù hợp. Nó sẽ được tạo lại nếu tôi chuyển sang một hoạt động khác và ràng buộc nó một lần nữa? hoặc Chủ đề vẫn còn là chủ đề cuối cùng? – gumuruh

0

Bạn có thể tìm thấy nó ở đây: https://developer.android.com/guide/components/bound-services.html

Bạn có thể kết nối nhiều khách hàng đến một dịch vụ cùng một lúc. Tuy nhiên, hệ thống lưu trữ kênh truyền thông dịch vụ IBinder. Nói cách khác, hệ thống gọi phương thức onBind() của dịch vụ để tạo IBinder chỉ khi máy khách đầu tiên liên kết. Hệ thống sau đó cung cấp cùng một IBinder đó cho tất cả các máy khách bổ sung liên kết với cùng một dịch vụ đó mà không cần gọi lại onBind() một lần nữa.