17

W moim Android app rozpocząć IntentService z poziomu aktywności poprzez wywołanieJak utrzymać usługę IntentService nawet po zamknięciu aplikacji?

startService(new Intent(this, MyService.class)); 

I działa jak czar. Mogę poruszać się pomiędzy aktywacjami, naciskając przycisk Strona główna, aby przełączyć się do innych aplikacji ... i nadal działa. Ale jeśli usunę moją aplikację z ekranu ostatnich chwil, moja usługa zostanie zatrzymana. Jak mogę tego uniknąć? Innymi słowy, w jaki sposób mogę utrzymać moją usługę uruchomioną, nawet jeśli moja aplikacja jest zamknięta z ostatnich aplikacji?

Moje kod usługi jest następująca:

public class MyService extends IntentService { 

public MyService() { 
    super("MyService"); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    //Here I run a loop which takes some time to finish 
} 

} 
+0

IntentService nie pracuje cały czas, ale to działa na Intent podstawy. Wysyłasz, powiedzmy polecenie do wykonania (wykonaj jakąś pracę), używając funkcji Intent, a usługa wykonuje to zadanie i zatrzymuje się po tym. – Stan

+0

związane z usługą http://stackoverflow.com/questions/16651009/android-service-stops-when-app-is-closed –

+0

powiązane http://stackoverflow.com/questions/19562914/keeping-alive-intent-service - po zgłoszeniu-zabija się –

Odpowiedz

10

IntentService nie pracuje cały czas, ale to działa na Intent podstawy. Wysyłasz, powiedzmy polecenie do wykonania (wykonaj jakąś pracę), używając funkcji Intent, a usługa wykonuje to zadanie i zatrzymuje się po tym, czekając na inne intencje.
Powinieneś użyć zwykłej Service zamiast IntentService, aby osiągnąć swój cel. Usługa powinna być skonfigurowana jako START_STICKY.

+1

Nie, nie mam na myśli, żeby moja służba biegała przez cały czas. Moja usługa wymaga długotrwałej operacji. Muszę tylko upewnić się, że moja usługa nadal wykonuje tę operację, nawet jeśli moja aplikacja jest zamknięta. Po zakończeniu powinno się samo się zakończyć – fergaral

+0

Ponownie: Powinieneś użyć zwykłej usługi zamiast IntentService, aby osiągnąć swój cel. – Stan

+0

Mam zamiar spróbować. Dziękuję Ci! – fergaral

5

w swojej klasie usług @OverrideonStartCommand metoda

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // We want this service to continue running until it is explicitly 
    // stopped, so return sticky. 
    return START_STICKY; 
} 

Zabić samą usługę, można użyć stopSelf()

+0

Czy to naprawdę bezpieczne? Dokumenty stwierdzały: "Nie należy przesłonić tej metody dla IntentService. Zamiast tego należy zastąpić onHandleIntent (Intent), który system wywołuje, gdy IntentService otrzymuje żądanie uruchomienia. " –