2012-08-07 45 views

Trả lời

4

Không có API để tìm hiểu số lượng khách hàng bị ràng buộc với Dịch vụ.
Nếu bạn đang thực hiện dịch vụ của riêng mình, thì trong ServiceConnection của bạn, bạn có thể tăng/giảm số lượng tham chiếu để theo dõi số lượng khách hàng bị ràng buộc.

Sau đây là một số mã psudo để chứng minh ý tưởng:

MyService extends Service { 

    ... 

    private static int sNumBoundClients = 0; 

    public static void clientConnected() { 
     sNumBoundClients++; 
    } 

    public static void clientDisconnected() { 
     sNumBoundClients--; 
    } 

    public static int getNumberOfBoundClients() { 
     return sNumBoundClients; 
    } 
} 

MyServiceConnection extends ServiceConnection { 

    // Called when the connection with the service is established 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     ... 
     MyService.clientConnected(); 
     Log.d("MyServiceConnection", "Client Connected! clients = " + MyService.getNumberOfBoundClients()); 
    } 

    // Called when the connection with the service disconnects 
    public void onServiceDisconnected(ComponentName className) { 
     ... 
     MyService.clientDisconnected(); 
     Log.d("MyServiceConnection", "Client disconnected! clients = " + MyService.getNumberOfBoundClients()); 
    } 
} 
+0

+1 Tuy nhiên, điều này chỉ hoạt động nếu bạn có một dịch vụ cục bộ chạy trong cùng một quá trình với khách hàng của bạn. Nó không hoạt động nếu dịch vụ của bạn đang chạy trong một quá trình từ xa và nó cũng không hoạt động nếu bạn cung cấp dịch vụ của bạn cho nhiều khách hàng không phải là một phần của ứng dụng của bạn. –

+0

David là đúng, ví dụ của tôi sẽ chỉ làm việc cho một dịch vụ địa phương. –

+0

Tôi chưa có nhu cầu triển khai RemoteService, vì vậy tôi không chắc chắn danh sách RemoteCallback sẽ được sử dụng như thế nào để làm ví dụ của tôi làm việc với RemoteService. –

0

Hiện không có vẻ là một cách tiêu chuẩn dễ dàng để làm điều này. Tôi có thể nghĩ ra 2 cách. Dưới đây là cách đơn giản:

Thêm cuộc gọi vào API dịch vụ của bạn như disconnect(). Khách hàng nên gọi số disconnect() trước khi gọi số unbindService(). Tạo biến thành viên trong dịch vụ như private int clientCount để theo dõi số lượng khách hàng bị ràng buộc. Theo dõi số lượng khách hàng bị ràng buộc bằng cách tăng số lượng trong onBind() và giảm số lượng trong disconnect().

Cách phức tạp liên quan đến việc triển khai giao diện gọi lại từ dịch vụ của bạn cho khách hàng và sử dụng RemoteCallbackList để xác định số lượng khách hàng thực sự bị ràng buộc.

0

Bạn có thể theo dõi các khách hàng được kết nối bằng cách ghi đè onBind() (tăng count), onUnbind() (count giảm và trở về true) và onRebind() (tăng count).

+0

Theo [this] (https://groups.google.com/forum/#!msg/android-developers/2IegSgtGxyE/iXP3lBCH5SsJ), 'onBind()' được gọi một lần cho yêu cầu đầu tiên và được lưu trong bộ nhớ cache 'IBinder' được trả về bởi hệ thống về các yêu cầu tiếp theo mà không làm phiền dịch vụ. Tài liệu liên quan đến vấn đề này không chính xác. – Daniel

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