2012-08-07 6 views

답변

4

서비스에 바인딩 된 클라이언트 수를 확인하는 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()); 
    } 
} 
+0

+1 그러나 로컬 서비스가 클라이언트와 동일한 프로세스에서 실행되는 경우에만 작동합니다. 서비스가 원격 프로세스에서 실행 중이고 응용 프로그램에 포함되지 않은 여러 클라이언트에 서비스를 제공하는 경우 서비스가 작동하지 않는 경우 작동하지 않습니다. –

+0

David가 맞습니다. 본보기는 로컬 서비스에서만 작동합니다. –

+0

아직 RemoteService를 구현할 필요가 없으므로 RemoteCvice를 사용하여 예제를 작성하는 데 RemoteCallback 목록을 사용하는 방법을 모르겠습니다. –

0

이 작업을 수행 할 수있는 쉬운 표준 방법이있을 것 같지 않습니다

다음

는 아이디어를 설명하는 몇 가지 psudo 코드입니다. 나는 2 가지 방법을 생각할 수있다. 다음은 간단한 방법입니다.

disconnect()과 같은 서비스 API에 대한 호출을 추가하십시오. 클라이언트는 unbindService()을 호출하기 전에 disconnect()으로 전화해야합니다. 바운드 클라이언트 수를 추적하려면 private int clientCount과 같은 서비스의 멤버 변수를 만듭니다. 카운트를 onBind()에서 증가시키고이를 disconnect()에서 감소시켜 바운드 클라이언트 수를 추적하십시오.

복잡한 방법으로 서비스에서 클라이언트로 콜백 인터페이스를 구현하고 RemoteCallbackList을 사용하여 실제로 얼마나 많은 클라이언트가 바인딩되는지 확인해야합니다.

0

당신은 onBind() (증가 수), onUnbind() 재정 의하여 연결된 클라이언트를 추적 (감소 수를하고 true을 반환) 및 onRebind() (증가 수) 할 수 있습니다.

+0

[this] (https://groups.google.com/forum/#!msg/android-developers/2IegSgtGxyE/iXP3lBCH5SsJ)에 따르면, onBind()는 첫 번째 요청에 대해 한 번 호출되고 캐시 된 'IBinder' 서비스를 방해하지 않고 후속 요청에서 시스템에 의해 반환됩니다. 이 문제와 관련된 설명서가 잘못되었습니다. – Daniel

관련 문제