2012-08-07 14 views

Respuesta

4

No hay API para averiguar cuántos clientes están vinculados a un servicio.
Si está implementando su propio servicio, en su ServiceConnection puede incrementar/disminuir un recuento de referencias para realizar un seguimiento del número de clientes enlazados.

A continuación se presenta un cierto código psudo para demostrar la idea:

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 Sin embargo, esto solo funciona si tiene un servicio local ejecutándose en el mismo proceso que sus clientes. No funciona si su servicio se ejecuta en un proceso remoto y tampoco funciona si ofrece su servicio a múltiples clientes que no son parte de su aplicación. –

+0

David tiene razón, mi ejemplo solo funcionará para un servicio local. –

+0

No he tenido la necesidad de implementar un RemoteService todavía, así que no estoy seguro de cómo se usaría la lista RemoteCallback para hacer que mi ejemplo funcione con RemoteService. –

0

No parece ser una manera fácil, estándar de hacer esto. Puedo pensar en 2 maneras. Aquí está la manera simple:

Agregue una llamada a la API de su servicio como disconnect(). El cliente debe llamar al disconnect() antes de llamar al unbindService(). Cree una variable miembro en el servicio como private int clientCount para realizar un seguimiento del número de clientes enlazados. Realice un seguimiento del número de clientes enlazados incrementando el recuento en onBind() y disminuyéndolo en disconnect().

La manera complicada consiste en implementar una interfaz de devolución de llamada desde su servicio a los clientes y utilizando RemoteCallbackList para determinar cuántos clientes están realmente vinculados.

0

Puede hacer un seguimiento de los clientes conectados anulando onBind() (aumento de recuento), onUnbind() (recuento de descenso y volver true) y onRebind() (aumento de recuento).

+0

Según [esto] (https://groups.google.com/forum/#!msg/android-developers/2IegSgtGxyE/iXP3lBCH5SsJ), 'onBind()' se llama una vez para la primera solicitud y un 'IBinder' en caché es devuelto por el sistema en solicitudes posteriores sin molestar al servicio. La documentación con respecto a este problema es incorrecta. – Daniel

Cuestiones relacionadas