Jaka jest różnica między wdrażaniem usług w Androidzie START_STICKY
i START_NOT_STICKY
podczas wdrażania? Czy ktoś mógłby wskazać kilka standardowych przykładów ..?
źródło
Jaka jest różnica między wdrażaniem usług w Androidzie START_STICKY
i START_NOT_STICKY
podczas wdrażania? Czy ktoś mógłby wskazać kilka standardowych przykładów ..?
Oba kody są ważne tylko wtedy, gdy w telefonie zabraknie pamięci i zabije usługę przed zakończeniem działania. START_STICKY
mówi systemowi operacyjnemu, aby odtworzył usługę po tym, jak będzie miała wystarczającą ilość pamięci, i zadzwoni onStartCommand()
ponownie z pustą intencją. START_NOT_STICKY
informuje system operacyjny, aby nie zawracał sobie głowy ponownym odtwarzaniem usługi. Istnieje również trzeci kod, START_REDELIVER_INTENT
który nakazuje systemowi operacyjnemu odtworzenie usługi i ponowne dostarczenie tego samego celu onStartCommand()
.
Artykuł Dianne Hackborn wyjaśnił tło tego znacznie lepiej niż oficjalna dokumentacja.
Źródło: http://android-developers.blogspot.com.au/2010/02/service-api-changes-starting-with.html
Kluczową częścią tutaj jest nowy kod wynikowy zwrócony przez funkcję, informujący system, co powinien zrobić z usługą, jeśli jej proces zostanie zabity podczas działania:
START_STICKY jest w zasadzie taki sam jak poprzednie zachowanie, w którym usługa jest pozostawiana „uruchomiona”, a później zostanie ponownie uruchomiona przez system. Jedyna różnica w porównaniu z poprzednimi wersjami platformy polega na tym, że jeśli zostanie ona zrestartowana, ponieważ proces zostanie zabity, funkcja onStartCommand () zostanie wywołana w następnej instancji usługi z zerową wartością Intent, zamiast w ogóle nie być wywoływana. Usługi korzystające z tego trybu powinny zawsze sprawdzać tę sprawę i odpowiednio sobie z nią radzić.
START_NOT_STICKY mówi, że po powrocie z onStartCreated (), jeśli proces zostanie zabity bez pozostałych poleceń startowych do dostarczenia, usługa zostanie zatrzymana zamiast ponownie uruchomiona. Ma to o wiele większy sens w przypadku usług, które mają być uruchamiane tylko podczas wykonywania wysyłanych do nich poleceń. Na przykład usługa może być uruchamiana co 15 minut od alarmu w celu sprawdzenia stanu sieci. Jeśli zostanie zabity podczas wykonywania tej pracy, najlepiej byłoby po prostu pozwolić, aby został zatrzymany i rozpocząć pracę przy następnym uruchomieniu alarmu.
START_REDELIVER_INTENT jest jak START_NOT_STICKY, z wyjątkiem sytuacji, gdy proces usługi zostanie zabity przed wywołaniem stopSelf () dla określonej intencji, ta intencja zostanie do niej ponownie dostarczona, dopóki się nie zakończy (chyba że po kilku kolejnych próbach nadal nie może zostać zakończona, w którym momencie system się poddaje). Jest to przydatne w przypadku usług, które odbierają polecenia pracy i chcą się upewnić, że ostatecznie wykonają pracę dla każdego wysłanego polecenia.
START_NOT_STICKY
?START_REDELIVER_INTENT
jest jakSTART_NOT_STICKY
. Zamiast tego jest jakSTART_STICKY
Odpowiedź KISS
Różnica:
START_STICKY
system spróbuje odtworzyć twoją usługę po jej zabiciu
START_NOT_STICKY
system nie będzie próbował odtworzyć usługi po jej zabiciu
Standardowy przykład:
źródło
START_REDELIVER_INTENT
. Właśnie przetestowałemSTART_STICKY
i zabiłem aplikację przez ostatnie aplikacje. Następnie przywołuje usługę. AleSTART_REDELIVER_INTENT
nigdy więcej nie zadzwoniłem. Czemu?Dokumentacja
START_STICKY
iSTART_NOT_STICKY
jest dość prosta.START_STICKY:
Przykład: próbka usługi lokalnej
START_NOT_STICKY:
Przykład: ServiceStartArguments.java
źródło