2012-08-07 10 views

risposta

4

Non c'è API per scoprire quanti client sono associati a un servizio.
Se si sta implementando il proprio servizio, nel ServiceConnection è possibile incrementare/ridurre un conteggio dei riferimenti per tenere traccia del numero di client associati.

seguito è un codice psudo per dimostrare l'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 Tuttavia, questo funziona solo se si dispone di un servizio locale in esecuzione nello stesso processo dei client. Non funziona se il tuo servizio è in esecuzione in un processo remoto e non funziona anche se offri il tuo servizio a più client che non fanno parte della tua applicazione. –

+0

David ha ragione, il mio esempio funzionerà solo per un servizio locale. –

+0

Non ho ancora avuto la necessità di implementare un RemoteService, quindi non sono sicuro di come sarebbe stato usato l'elenco RemoteCallback per far funzionare il mio esempio con un RemoteService. –

0

Non sembra essere un modo standard di semplice per farlo. Posso pensare a 2 modi. Ecco il modo semplice:

Aggiungi una chiamata all'API del tuo servizio come disconnect(). Il client deve chiamare disconnect() prima di chiamare unbindService(). Creare una variabile membro nel servizio come private int clientCount per tenere traccia del numero di client associati. Tenere traccia del numero di client associati incrementando il conteggio in onBind() e diminuendolo in disconnect().

Il modo complicato prevede l'implementazione di un'interfaccia di callback dal servizio ai client e l'utilizzo di RemoteCallbackList per determinare quanti client sono effettivamente associati.

0

È possibile tenere traccia dei client connessi sovrascrivendo onBind() (Aumento conta), onUnbind() (conteggio diminuzione e tornare true) e onRebind() (conteggio aumento).

+0

Secondo [questo] (https://groups.google.com/forum/#!msg/android-developers/2IegSgtGxyE/iXP3lBCH5SsJ), 'onBind()' viene chiamato una volta per la prima richiesta e un 'IBinder memorizzato nella cache ' viene restituito dal sistema su richieste successive senza disturbare il servizio. La documentazione relativa a questo problema non è corretta. – Daniel

Problemi correlati