Android: как определить, сколько клиентов привязано к услуге?

В сервисе Android есть способ определить, сколько клиентов к нему привязано?

3 ответа

Решение

Нет API, чтобы узнать, сколько клиентов привязано к Сервису.
Если вы внедряете свой собственный сервис, то в ServiceConnection вы можете увеличивать / уменьшать счетчик ссылок, чтобы отслеживать количество связанных клиентов.

Ниже приведен псевдо-код для демонстрации идеи:

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());
    }
}

Вы можете отслеживать подключенных клиентов, переопределив onBind() (увеличить количество), onUnbind() (уменьшить количество и вернуть true) а также onRebind() (увеличить количество).

Кажется, нет простого, стандартного способа сделать это. Я могу придумать 2 способа. Вот простой способ:

Добавить вызов в API вашего сервиса, как disconnect(), Клиент должен позвонить disconnect() прежде чем это вызовет unbindService(), Создайте переменную-член в службе, как private int clientCount отслеживать количество связанных клиентов. Отслеживайте количество связанных клиентов, увеличивая количество в onBind() и уменьшая его в disconnect(),

Сложный способ включает в себя реализацию интерфейса обратного вызова от вашего сервиса к клиентам и использование RemoteCallbackList определить, сколько клиентов на самом деле связано.

Другие вопросы по тегам