Sobes.tech
Middle

Jaki jest cykl życia usług w Androidzie?

sobes.tech AI

Odpowiedź od AI

Serwis nie ma interfejsu użytkownika i działa w tle. Jego cykl życia jest zarządzany przez trzy główne metody:

  • onCreate(): Wywoływana po raz pierwszy, gdy serwis jest tworzony. Tutaj wykonywana jest inicjalizacja.
  • onStartCommand() / metoda wywoływana podczas podłączania (np. onBind()): onStartCommand() jest wywoływana podczas uruchomienia serwisu za pomocą startService(). Zwraca flagę wskazującą, jak system powinien przywrócić serwis, jeśli zostanie zakończony. onBind() jest wywoływana podczas podłączania klienta do serwisu za pomocą bindService().
  • onDestroy(): Wywoływana, gdy serwis jest niszczony. Zwolnione są wszystkie zasoby.

Istnieją dwa typy serwisów wpływających na cykl życia:

  • Serwis uruchomiony (Started Service): Uruchamiany przez startService(). Działa do momentu, gdy zostanie wyraźnie zatrzymany przez stopSelf() lub stopService(). System spróbuje go ponownie uruchomić po zniszczeniu, jeśli onStartCommand() zwrócił odpowiedni flagę.
  • Serwis powiązany (Bound Service): Uruchamiany przez bindService(). Istnieje tak długo, jak co najmniej jeden aktywny klient jest do niego podłączony. Gdy wszyscy klienci odłączą się, serwis jest niszczony. onBind() zwraca implementację IBinder, która jest używana do interakcji z serwisem.

Diagram cyklu życia:

        Start Service --+--> onStartCommand() --+--> Uruchomiony
                        |                         |
        Bind Service ---+--> onBind() -----------+--> Powiązany
                        |
        onCreate() -----+
                        |
                        +--> onRebind()
                        |
        onDestroy() <---+-------------------------+---- Odłączony <--- unbindService()
                                                 |
                                                 +---- Zatrzymany <--- stopSelf() / stopService()

Kluczowe punkty:

  • onCreate() jest wywoływana tylko raz.
  • onStartCommand() może być wywoływana wielokrotnie, jeśli startService() jest wywoływana wielokrotnie.
  • Serwis działa w głównym wątku interfejsu użytkownika domyślnie. Długotrwałe operacje powinny być wykonywane w osobnym wątku lub za pomocą IntentService.
  • Serwisy powiązane mają bardziej skomplikowany cykl życia, zależny od stanu klientów.

Przykład onStartCommand():

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // Wykonaj jakieś działania
    // Na przykład, rozpocznij pracę w tle
    
    // Zwróć flagę określającą zachowanie systemu przy niszczeniu serwisu
    return START_STICKY; // Serwis zostanie przywrócony, jeśli zostanie zakończony
}

Przykład onBind():

private final IBinder binder = new LocalBinder();

public class LocalBinder extends Binder {
    MyService getService() {
        // Zwraca instancję serwisu dla klientów
        return MyService.this;
    }
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return binder;
}

@Override
public boolean onUnbind(Intent intent) {
    // Wywoływana, gdy wszyscy klienci odłączą się
    return super.onUnbind(intent);
}