„Jeśli uruchomisz usługę systemu Android z startService(..)
tą usługą, pozostanie ona uruchomiona do momentu jawnego wywołania stopService(..)
. Istnieją dwa powody, dla których usługa może być uruchomiona przez system. Jeśli ktoś zadzwoni, Context.startService()
system pobierze usługę (utworzy ją i wywoła onCreate()
metodę, jeśli potrzebne), a następnie wywołaj swoją onStartCommand(Intent, int, int)
metodę z argumentami dostarczonymi przez klienta. Usługa będzie w tym momencie działać do momentu wywołania Context.stopService()
lub jej stopSelf()
wywołania. Należy pamiętać, że wielokrotne wywołania Context.startService()
nie zagnieżdżają się (chociaż skutkują wieloma odpowiadającymi im wywołaniami onStartCommand()
), więc nie bez względu na to, ile razy jest uruchamiana, usługa zostanie zatrzymana raz Context.stopService()
lub stopSelf()
zostanie wywołana; jednak usługi mogą używać ichstopSelf(int)
metoda, aby upewnić się, że usługa nie zostanie zatrzymana, dopóki nie zostaną przetworzone rozpoczęte intencje.
Klienci mogą również używać Context.bindService()
do uzyskiwania trwałego połączenia z usługą. Powoduje to również utworzenie usługi, jeśli jeszcze nie jest uruchomiona (wywołuje onCreate()
podczas wykonywania tej czynności), ale nie wywołuje onStartCommand()
. Klient otrzyma IBinder
obiekt, który usługa zwraca ze swojej onBind(Intent)
metody, umożliwiając klientowi następnie wywołanie z powrotem do usługi. Usługa będzie działać tak długo, jak długo zostanie nawiązane połączenie (niezależnie od tego, czy klient zachowuje odniesienie do Usługi IBinder
). Zwykle IBinder
zwracany jest dla złożonego interfejsu, który został napisany w AIDL.
Usługę można zarówno uruchomić, jak i powiązać z nią połączenia. W takim przypadku system będzie utrzymywał usługę tak długo, jak długo jest uruchomiona lub istnieje co najmniej jedno połączenie z nią oznaczone Context.BIND_AUTO_CREATE
flagą. Gdy żadna z tych sytuacji nie jest spełniona, onDestroy()
wywoływana jest metoda Usługi, a usługa zostaje skutecznie zakończona. Całe czyszczenie (zatrzymywanie wątków, wyrejestrowywanie odbiorców) powinno być zakończone po powrocie z onDestroy()
. ”
Przede wszystkim dwie rzeczy, które musimy zrozumieć
Klient
wysyła żądanie do określonego serwera
bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);`
tutaj
mServiceConn
jest instancjaServiceConnection
klasy (wbudowana), w rzeczywistości jest to interfejs, który musimy zaimplementować z dwoma (pierwszą dla sieci połączonej i drugą niepodłączoną) metodami monitorowania stanu połączenia sieciowego.serwer
Teraz po stronie klienta, jak uzyskać dostęp do wszystkich metod serwera?
serwer wysyła odpowiedź z IBind Object.so Obiekt IBind jest naszym handlerem, który uzyskuje dostęp do wszystkich metod obsługi za pomocą operatora (.).
MyService myService; public ServiceConnection myConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder binder) { Log.d("ServiceConnection","connected"); myService = binder; } //binder comes from server to communicate with method's of public void onServiceDisconnected(ComponentName className) { Log.d("ServiceConnection","disconnected"); myService = null; } }
teraz jak wywołać metodę, która leży w służbie
myservice.serviceMethod();
oto
myService
przedmiot iserviceMethode
metoda w służbie. W ten sposób zostaje nawiązana komunikacja między klientem a serwerem.źródło
próbowałem zadzwonić
startService(oIntent); bindService(oIntent, mConnection, Context.BIND_AUTO_CREATE);
w konsekwencji i mogę stworzyć lepką usługę i połączyć się z nią. Szczegółowy samouczek dotyczący przykładu usługi powiązanej .
źródło
Istnieje metoda o nazwie unbindService, która pobierze ServiceConnection, które utworzysz po wywołaniu bindService. Umożliwi to rozłączenie się z usługą, nie wyłączając jej jednocześnie.
Może to stanowić problem, gdy połączysz się z nim ponownie, ponieważ prawdopodobnie nie wiesz, czy działa, czy nie, gdy ponownie rozpoczynasz działanie, więc musisz wziąć to pod uwagę w swoim kodzie działania.
Powodzenia!
źródło
To stronnicza odpowiedź, ale napisałem bibliotekę, która może uprościć korzystanie z usług Androida, jeśli działają lokalnie w tym samym procesie co aplikacja: https://github.com/germnix/acacia
Zasadniczo definiujesz interfejs z adnotacją @Service i jego klasą implementującą, a biblioteka tworzy i wiąże usługę, obsługuje połączenie i wątek roboczy w tle:
@Service(ServiceImpl.class) public interface MyService { void doProcessing(Foo aComplexParam); } public class ServiceImpl implements MyService { // your implementation } MyService service = Acacia.createService(context, MyService.class); service.doProcessing(foo); <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> ... <service android:name="com.gmr.acacia.AcaciaService"/> ... </application>
Możesz uzyskać instancję powiązanej usługi android.app.Service, aby ukryć / pokazać trwałe powiadomienia, użyć własnego android.app.Service i ręcznie obsługiwać wątki, jeśli chcesz.
źródło
Jeśli użytkownik wycofa się,
onDestroy()
metoda zostanie wywołana. Ta metoda polega na zatrzymaniu dowolnej usługi używanej w aplikacji. Jeśli więc chcesz kontynuować usługę, nawet jeśli użytkownik wycofa się z aplikacji, po prostu usuńonDestroy()
. Mam nadzieję, że to pomoże.źródło