2012-08-07 4 views

Odpowiedz

4

Nie ma interfejsu API, aby dowiedzieć się, ilu klientów jest związanych z usługą.
Jeśli wdrażasz własną usługę, w usłudze ServiceConnection możesz zwiększać/zmniejszać licznik odwołań, aby śledzić liczbę powiązanych klientów.

Po jakiś kod psudo zademonstrować pomysł:

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 Działa to jednak tylko wtedy, gdy lokalna usługa działa w tym samym procesie co klienci. Nie działa, jeśli usługa jest uruchomiona w procesie zdalnym, a także nie działa, jeśli oferujesz usługę wielu klientom, którzy nie są częścią Twojej aplikacji. –

+0

David ma rację, mój przykład działa tylko w przypadku usługi lokalnej. –

+0

Nie miałem jeszcze potrzeby implementacji usługi RemoteService, więc nie jestem pewien, w jaki sposób będzie używana lista RemoteCallback, aby mój przykład działał z usługą RemoteService. –

0

nie wydaje się być prosty, standardowy sposób to zrobić. Mogę wymyślić 2 sposoby. Oto prosty sposób:

Dodaj połączenie do interfejsu API usługi, na przykład disconnect(). Klient powinien zadzwonić pod numer disconnect(), zanim zadzwoni pod numer unbindService(). Utwórz zmienną składową w usłudze, taką jak private int clientCount, aby śledzić liczbę powiązanych klientów. Śledź liczbę powiązanych klientów, zwiększając liczbę w onBind() i zmniejszając ją w disconnect().

Ten skomplikowany sposób obejmuje implementację interfejsu wywołania zwrotnego z usługi do klientów i użycie RemoteCallbackList do ustalenia, ile klientów jest rzeczywiście powiązanych.

0

Możesz śledzić podłączonych klientów nadrzędnymi onBind() (licznik), wzrost liczby onUnbind() (spadek i powrót true) i onRebind() (liczba wzrost).

+0

Zgodnie z [this] (https://groups.google.com/forum/#!msg/android-developers/2IegSgtGxyE/iXP3lBCH5SsJ), 'onBind()' jest wywoływane raz dla pierwszego żądania i buforowane 'IBinder' jest zwracany przez system na kolejnych prośbach bez przeszkadzania w obsłudze. Dokumentacja dotycząca tego problemu jest niepoprawna. – Daniel

Powiązane problemy