2010-08-02 35 views
15

Trong ứng dụng Android của tôi, tôi gọi cả hai startServicebindService:Tôi có cần gọi cả dịch vụ unbindService và stopService cho các dịch vụ Android không?

Intent intent = new Intent(this, MyService.class); 
ServiceConnection conn = new ServiceConnection() { ... } 

startService(intent) 
bindService(intent, conn, BIND_AUTO_CREATE); 

Sau đó, tôi cố gắng để cả hai unbindService and stopService`:

unbindService(conn); 
stopService(intent); 

Tuy nhiên, tôi nhận được một ngoại lệ về cuộc gọi đến unbindService. Nếu tôi xóa cuộc gọi này, ứng dụng có vẻ chạy đúng cách thông qua cuộc gọi stopService.

Tôi có làm gì sai không? Tôi nghĩ rằng cuộc gọi bindService phải được liên kết với cuộc gọi unbindService và cuộc gọi startService phải được liên kết với cuộc gọi stopService. Điều này dường như không phải là trường hợp ở đây, mặc dù.

+0

Bạn đã bao giờ tìm ra điều này chưa? Tôi chạy vào cùng một điều, và nhận xét ra unbindService (conn) cho bản thân mình. Dường như làm việc ổn, nhưng cũng giống như bạn, ruột của tôi nói điều gì đó trong nền sẽ không thích nó. –

Trả lời

24

Tài liệu Android cho stopService() khẳng định:

Lưu ý rằng nếu một dịch vụ ngừng vẫn có đối tượng ServiceConnection ràng buộc để nó với các thiết lập BIND_AUTO_CREATE, nó sẽ không bị phá hủy cho đến khi tất cả các cam kết ràng buộc được loại bỏ. Xem tài liệu Dịch vụ để biết thêm chi tiết về vòng đời của dịch vụ.

Vì vậy, hãy gọi stopService() trước tiên theo sau là unbindService() sẽ hoạt động (nó hoạt động với tôi).

+1

Ahh, do đó, có vẻ như thứ tự của tôi về 'unbindService' và' stopService' là ngược lại, tôi hiểu. –

+0

Cảm ơn, điều này đã giúp tôi! Tôi đã sử dụng BIND_AUTO_CREATE và unbindService() để giải quyết vấn đề với sự rò rỉ ServiceConnection. – lomza

+0

@Matt Huggins để các bạn có ý định unbind đầu tiên và sau đó dừng lại là nó? –

5

Như bạn có thể thấy here nó phụ thuộc vào những gì bạn muốn đạt được và cách bạn ràng buộc dịch vụ. Nếu bạn muốn có một thời gian dài tham chiếu đến dịch vụ, tốt hơn là sử dụng bindService hơn startService. Nếu trong phương thức bindService, cờ BIND_AUTO_CREATE được sử dụng, thì bạn không phải gọi startService, vì dịch vụ bắt đầu chính nó khi cần thiết.

Nếu bạn gọi dịch vụ không liên quan, khi đó, bạn không đồng ý với dịch vụ này. Bạn không 'phải dứt khoát dừng dịch vụ nhưng bạn có thể. Nhưng importatnt cần lưu ý, nếu bạn gọi unBind(), thì dịch vụ được phép dừng bất cứ lúc nào.

+1

Cảm ơn, nhưng tôi đã ở đó, và nó không rõ ràng nếu tôi cần cả hai unbind và ngừng dịch vụ nếu tôi tự khởi động nó trước khi ràng buộc với nó với cờ BIND_AUTO_CREATE. –

8

Bí quyết mà tôi nhấn với điều này:

Đảm bảo bạn gọi unbindService trên cùng ngữ cảnh mà bạn gọi là bindService. Trong trường hợp của tôi, tôi đã làm những điều sau đây để ràng buộc nó:

Context c = getApplicationContext(); 
c.bindService(...); 

Sau đó, để unbind nó, chỉ cần:

unbindService(...); 

Đảm bảo cả hai ràng buộc và unbind sử dụng bối cảnh tương tự giải quyết vấn đề.

+1

cảm ơn - chỉ bị vấp ngã bởi điều này – SteelBytes

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