2013-07-18 6 views

Odpowiedz

24

Według oficjalnego dokumentu, usługa onServiceDisconnected() zostanie wywołana, jeśli usługa uległa awarii lub została zabita. Link http://developer.android.com/reference/android/content/ServiceConnection.html

Wywoływany, gdy połączenie z Usługą zostało utracone. Zdarza się to zazwyczaj, gdy proces hostujący usługę został zawieszony lub został zabity. Nie powoduje to usunięcia samego połączenia ServiceConnection - to powiązanie z usługą pozostanie aktywne, a po uruchomieniu usługi otrzymasz połączenie do onServiceConnected (nazwa komponentu, IBinder).

+1

Ok. Tak więc wyślę 'Broadcast', aby powiadomić, że' Service' się zatrzymał. – jul

+0

Jeśli łączysz się z usługą, możesz po prostu wysłać powiadomienie, a następnie nazwać stopSelf() –

+0

'stopSelf()' jest wywoływany bezpośrednio w 'Usługa' (gdy nie ma już pobierania do wykonania), a nie metodą z "Aktywność". – jul

21

Wystarczy wysłanie powiadomienia do klienta i związaną nazywając stopSelf() (lub stopService()) nie będzie faktycznie osiągnąć to, co staramy się robić. Musisz zadzwonić pod numer unbindService() w powiązanym kliencie (a usługa nie może mieć innych powiązanych klientów), aby faktycznie zniszczyć usługę.

Istnieją dwa rodzaje Usług, usługi "uruchomione" i usługi "powiązane". Nie wykluczają się wzajemnie. Jeśli uruchomiłeś usługę przy użyciu startService(), masz usługę "uruchomioną". Jeśli uruchomisz usługę przez bindService(), zostanie ona powiązana. Jeśli łączysz się z usługą i używasz startService(), jest to jedno i drugie. Dostępne są trzy opcje zarządzania cyklem życia usługi:

1) Uruchomiona usługa: dzwonisz pod numer startService(), aby go uruchomić; Usługa zostanie zatrzymana tylko pod numerem stopService() lub stopSelf().

2) Usługa związana: dzwonisz pod numer bindService() i przekazujesz flagę BIND_AUTO_CREATE. Inni klienci mogą wiązać i odsyłać do usługi w dowolnym momencie, usługa zostanie automatycznie zniszczona po odłączeniu wszystkich klientów. W takim przypadku wywołanie stopService() lub stopSelf() nie daje żadnego efektu.

3) Kombinacja: klienci wiążą się z usługą, a także zadzwonili pod numer startService(). W takim przypadku wywołanie stopSelf() lub stopService() spowoduje zniszczenie usługi dopiero po odłączeniu wszystkich klientów. Podobnie usługa nie zostanie automatycznie zniszczona, gdy wszyscy klienci się odłączyli, dopóki nie zostaną wywołani stopSelf() lub stopService().

Dokumentacja dla cyklu życia usług kombi mówi:

Te dwie ścieżki nie są całkowicie oddzielone. Oznacza to, że możesz połączyć się z usługą , która została już uruchomiona pod numerem startService(). Na przykład usługa muzyczna w tle może zostać uruchomiona przez wywołanie startService() z intencją, która identyfikuje muzykę do odtwarzania.Później, być może, gdy użytkownik chce przejąć kontrolę nad odtwarzaczem lub uzyskać informacje o bieżącym utworze, może powiązać usługę z numerem , dzwoniąc pod numer bindService(). W takich przypadkach, stopService() lub stopSelf() faktycznie nie zatrzymuje usługi , dopóki wszyscy klienci się nie zwiążą.

W twoim przypadku masz klienta związanego. Wywołanie stopSelf() nie powoduje rozłączenia powiązanych klientów, więc musisz jawnie powiadomić klienta, że ​​usługa chce się zamknąć, a następnie klient musi zadzwonić pod numer unbindService(), zanim usługa zostanie zniszczona. Możesz to zrobić na wiele sposobów, najprościej mówiąc, za pośrednictwem interfejsu broadcast lub IBinder, lub komunikatora lub AIDL, jeśli komunikujesz się z usługą w różnych procesach.

+0

Interesujące, dzięki. Tak więc, wywołując 'stopSelf()' z mojej 'usługi ', muszę również wysłać' Broadcast' do mojego klienta, aby powiedzieć mu, żeby się odwijał. – jul

+0

Doskonałe wyjaśnienie, dzięki. –

Powiązane problemy