Android onCreate lub onStartCommand do uruchamiania usługi

105

Zwykle podczas tworzenia usługi Android implementuję tę onCreatemetodę, ale w moim ostatnim projekcie to nie działa. Próbowałem wdrożyć onStartCommandi wydaje się, że działa.

Pytanie brzmi: kiedy muszę wdrożyć usługę, która metoda jest wymagana? Jakie metody muszę wdrożyć? onCreate, onStartCommandczy oba? Jaka jest rola każdego z nich?

GVillani82
źródło
onCreatejest zawsze wywoływany niezależnie
IgorGanapolsky

Odpowiedzi:

189

onCreate()jest wywoływana, gdy Serviceobiekt jest tworzony (to znaczy: gdy usługa jest tworzony ). W tej metodzie powinieneś robić rzeczy, które musisz zrobić tylko raz (np .: zainicjować niektóre zmienne itp.). onCreate()będzie wywoływana tylko raz na instancję obiektu .

Musisz zaimplementować tylko onCreate()wtedy, gdy faktycznie chcesz / musisz zainicjować coś tylko raz .

onStartCommand()jest wywoływana za każdym razem, gdy klient uruchamia usługę przy użyciu startService(Intent intent). Oznacza to, że onStartCommand()można dzwonić wielokrotnie. W tej metodzie należy wykonać czynności, które są potrzebne za każdym razem, gdy klient zażąda czegoś od Twojej usługi. Zależy to w dużej mierze od tego, co robi Twoja usługa i jak komunikuje się z klientami (i odwrotnie).

Jeśli nie zaimplementujesz onStartCommand(), nie będziesz w stanie uzyskać żadnych informacji od Intentklienta, onStartCommand()a Twoja usługa może nie być w stanie wykonać żadnej użytecznej pracy.

David Wasser
źródło
6
Czy w aplikacji mogą istnieć dwa wystąpienia tej samej usługi?
jacktrades
1
@jacktrades Teoretycznie i zgodnie z dokumentacją: Nie. Jednak wydaje się, że jest jakiś błąd w Androidzie, który w pewnych okolicznościach tworzy wiele instancji Usługi. Jednak, jak powiedziałem, jest to błąd i nie byliśmy w stanie wiarygodnie go odtworzyć do woli. Dlaczego pytasz?
David Wasser
3
@Mr_and_Mrs_D O ile wiem, nie zgłoszono żadnych oficjalnych błędów. Jest jednak kilka doniesień o tym i mam aplikację, w której wiem, że tak się dzieje. Nie udało mi się zredukować problemu do czegoś małego i powtarzalnego, więc sam nie zgłosiłem błędu. Dokumentacja nie stwierdza wyraźnie, że usługi są singletonami, ale jest bardzo jasne, że jest to zamierzone. Spójrz na dokumentację dla 'startService ()': jasno stwierdza, że jeśli usługa nie jest jeszcze uruchomiona, zostanie utworzona i uruchomiona, jeśli jest uruchomiona, nadal działa
David Wasser
6
@Diffy Kiedy dzwonisz startService(), jeśli usługa nie jest uruchomiona, Android utworzy wystąpienie klasy usługi (jest to obiekt usługi), a następnie wywoła onCreate()ten obiekt. Następnie wywoła onStartCommand()ten obiekt. Jeśli po jakimś czasie ponownie zadzwonisz startService(), jeśli usługa nadal działa, system Android nie utworzy nowego obiektu usługi. Zamiast tego po prostu wywoła onStartCommand()istniejący obiekt usługi. Czy to jasne?
David Wasser
1
Kocham Cię! (y) działało jak magia (y) bardzo proste i dobre wyjaśnienie
Hilton Khadka,
11

Usługa zachowuje się tak samo, jak działanie Cokolwiek zechcesz, associateraz z usługą, będzie to onCreatejak inicjalizacja

i zawsze, gdy servicewywoływana jest przy użyciu startService . onStartCommandbędzie wezwany. i możesz przekazać dowolną akcję do wykonania. jak w przypadku odtwarzacza muzyki, możesz grać, pauzować, przestać używać akcji

I robisz wszystko operation in service, wysyłając akcję i odbierając jąonStartCommand

onCreate pracować jak konstruktor.

Edytuj w skrócie

onCreate()dzwoni tylko za pierwszym razem, gdy rozpoczynasz a ServicePodczas onStartCommand()połączeń za każdym razem, gdy dzwonisz startServiceponownie. Pozwala ustawić akcję, taką jak odtwarzanie, zatrzymywanie, wstrzymywanie muzyki.

public void onStartCommand()
{
     if(intent.getAction.equals("any.play")
     {
        //play song
     }
     else if(intent.getAction.equals("any.stop")
     {}
}
AndroidGeek
źródło
Więc kiedy dzwonię do usługi przy użyciu startService (intent), czy onCreate () nie zostanie wywołany? Mam wątpliwości, co to jest „obiekt usługi”, ponieważ zawsze uruchamiałem usługę przez startSevice (zamiar).
Diffy,
czy poprawnie utworzyłeś obiekt usługi lub prawdopodobnie nie masz usługi w swoim manifeście
AndroidGeek
uruchom usługę, taką jak startService (new Intent (this, ServiceName.class));
AndroidGeek,
Ale czy ta metoda nazywa się tworzeniem wystąpienia usługi? Gdzie zatem jest obiekt usługowy?
Diffy,
jest to sposób wywoływania Aktywności i Usługi przy użyciu zamiaru odpowiedzialnego za otwarcie Aktywności i Usługi w Androidzie. To, co chcesz zrobić z przedmiotem usługi, możesz też zrobić z zamiarem. mam na myśli przekazywanie danych do Serwisu
AndroidGeek,