2013-07-18 32 views
18

Tôi có một Activity trong đó tôi bắt đầu và liên kết với tải xuống Service.onServiceDisconnected() không được gọi sau khi gọi Dịch vụ stopSelf()

Khi gọi stopSelf() trong Service, onServiceDisconnected() trong số Activity không được gọi.

Tôi hy vọng nó sẽ được gọi, vì nếu Service bị dừng, tất cả các hoạt động bị ràng buộc sẽ không bị ràng buộc.

Tôi đang thiếu gì?

Trả lời

24

Theo tài liệu chính thức, onServiceDisconnected() sẽ được gọi nếu dịch vụ bị lỗi hoặc bị giết. Liên kết http://developer.android.com/reference/android/content/ServiceConnection.html

Được gọi khi kết nối với Dịch vụ bị mất. Điều này thường xảy ra khi quá trình lưu trữ dịch vụ đã bị lỗi hoặc bị giết. Điều này không tự xóa ServiceConnection - liên kết này với dịch vụ sẽ vẫn hoạt động và bạn sẽ nhận được một cuộc gọi đến onServiceConnected (ComponentName, IBinder) khi Dịch vụ đang chạy tiếp theo.

+1

Ok. Vì vậy, tôi sẽ gửi một 'Broadcast' để thông báo cho' Service' đã dừng lại. – jul

+0

Nếu bạn liên kết với dịch vụ thì bạn chỉ có thể gửi thông báo và sau đó được gọi là stopSelf() –

+0

'stopSelf()' được gọi trực tiếp trong 'Dịch vụ' (khi không còn tải xuống), không phải bằng phương thức từ 'Hoạt động'. – jul

21

Chỉ cần gửi thông báo đến khách hàng bị ràng buộc và gọi stopSelf() (hoặc stopService()) sẽ không thực sự thực hiện những gì bạn đang cố gắng làm. Bạn phải gọi unbindService() trong máy khách bị ràng buộc (và dịch vụ phải không có máy khách bị ràng buộc nào khác) để thực sự phá hủy dịch vụ.

Có hai loại dịch vụ, dịch vụ "bắt đầu" và dịch vụ "bị ràng buộc". Họ không phải là loại trừ lẫn nhau. Nếu bạn bắt đầu dịch vụ bằng cách sử dụng startService(), bạn có dịch vụ "bắt đầu". Nếu bạn bắt đầu dịch vụ thông qua bindService(), nó sẽ bị ràng buộc. Nếu bạn liên kết với dịch vụ và cũng sử dụng startService(), cả hai đều là. Vì vậy, có ba tùy chọn có thể để quản lý vòng đời của dịch vụ:

1) Bắt đầu dịch vụ: bạn gọi startService() để bắt đầu; dịch vụ sẽ chỉ dừng lại bằng cách gọi stopService() hoặc stopSelf().

2) Dịch vụ ràng buộc: bạn gọi bindService() và chuyển vào cờ BIND_AUTO_CREATE. Các máy khách khác có thể liên kết và hủy liên kết với dịch vụ theo ý muốn, dịch vụ sẽ tự động bị hủy khi tất cả các máy khách đã tách ra. Trong trường hợp này, hãy gọi stopService() hoặc stopSelf() không có hiệu lực.

3) Kết hợp: khách hàng liên kết với dịch vụ và bạn cũng được gọi là startService(). Trong trường hợp này, gọi số stopSelf() hoặc stopService() sẽ chỉ hủy dịch vụ sau khi tất cả khách hàng đã tách ra. Tương tự như vậy, dịch vụ sẽ không bị hủy tự động khi tất cả khách hàng đã tách ra, cho đến khi stopSelf() hoặc stopService() đã được gọi.

Các tài liệu cho chu kỳ cho các dịch vụ kết hợp nói:

Hai con đường không hoàn toàn riêng biệt. Nghĩa là, bạn có thể liên kết với dịch vụ đã được bắt đầu với startService(). Ví dụ: một dịch vụ nhạc nền có thể được bắt đầu bằng cách gọi số startService() với mục đích xác định nhạc để phát.Sau đó, có thể khi người dùng muốn thực hiện kiểm soát đối với người chơi hoặc nhận thông tin về bài hát hiện tại, một hoạt động có thể liên kết với dịch vụ bằng cách gọi bindService(). Trong các trường hợp như thế này, stopService() hoặc stopSelf() không thực sự ngừng dịch vụ cho đến khi tất cả khách hàng hủy liên kết.

Vì vậy, trong trường hợp của bạn, bạn có một khách hàng bị ràng buộc. Gọi stopSelf() không buộc phải ngắt kết nối máy khách bị ràng buộc, vì vậy bạn phải thông báo rõ ràng cho khách hàng rằng dịch vụ muốn tắt máy và sau đó khách hàng của bạn phải gọi unbindService() trước khi dịch vụ bị hủy. Bạn có thể thực hiện điều đó theo nhiều cách khác nhau, hầu hết chỉ đơn giản thông qua một chương trình phát sóng hoặc giao diện IBinder, hoặc một sứ giả hoặc AIDL nếu bạn đang liên lạc với dịch vụ của mình qua các quy trình.

+0

Thú vị, cảm ơn. Vì vậy, khi gọi 'stopSelf()' từ 'Service' của tôi, tôi cũng phải gửi một 'Broadcast' cho khách hàng của tôi để nói với anh ta để unbind. – jul

+0

Giải thích tuyệt vời, Cảm ơn. –

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