Czy w usłudze Android istnieje sposób określania liczby klientów, którzy są z nią związani?Android: jak ustalić, ilu klientów jest związanych z usługą?
Odpowiedz
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());
}
}
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.
Możesz śledzić podłączonych klientów nadrzędnymi onBind()
(licznik), wzrost liczby onUnbind()
(spadek i powrót true
) i onRebind()
(liczba wzrost).
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
- 1. MVP Android - ilu prezenterów?
- 2. Margines związany z podstawową usługą Android TextView
- 3. Wyjątek Android ClassCast podczas wiązania z usługą
- 4. Jak pobrać plik z usługą w systemie Android?
- 5. jak pobrać plik z usługą w tle?
- 6. opublikować prywatną aplikację Android dla wielu klientów
- 7. Jak ustalić wersję Gradle?
- 8. Android: Jak uzyskać macierzystą nazwę pakietu klientów poczty e-mail
- 9. Jak ustalić, czy Kopiowanie lokalne jest konieczne?
- 10. Jak ustalić, czy ParameterInfo jest typu ogólnego?
- 11. Jak ustalić, czy tabela sql jest tymczasowa?
- 12. Jak ustalić, czy drzewo binarne jest kompletne?
- 13. Komunikacja klientów/rówieśników z wifi-direct na platformie Android
- 14. Android 6.0 RuntimeException: nie można połączyć się z usługą kamery
- 15. Dostęp do danych związanych z projektem z polecenia Gradle
- 16. PocketSphinx jak ustalić z gramatyki słów
- 17. Obsługa zdarzeń związanych z obsługą systemu Android, gdy menu jest widoczne.
- 18. Jak ustalić, czy obiekt jQuery jest odroczony?
- 19. Jak ustalić, czy powiązanie szyn jest przyspieszone?
- 20. Jak ustalić, czy jednostka doktrynalna jest trwała?
- 21. Jak ustalić, kiedy otwarty jest program fancybox?
- 22. Jak ustalić, czy NSString jest pusty?
- 23. Jak ustalić, czy IType jest klasą abstrakcyjną?
- 24. Jak ustalić ciąg jest angielski lub perski?
- 25. Jak ustalić, czy znak jest chiński znak
- 26. Jak ustalić, czy połączenie internetowe jest dostępne?
- 27. Jak ustalić, czy ścieżka jest podkatalogiem innej?
- 28. Jak ustalić, czy jest oczekiwany semafor wysyłkowy?
- 29. Jak ustalić, czy typ jest typem kolekcji?
- 30. Jak korzystać z wielu klientów w Kafce?
+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. –
David ma rację, mój przykład działa tylko w przypadku usługi lokalnej. –
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. –