Sobes.tech
Middle

Koji je životni ciklus servisa u Androidu?

sobes.tech АИ

Одговор од АИ

Servis nema UI i radi u pozadini. Njegov životni ciklus upravlja se sa tri glavne metode:

  • onCreate(): Poziva se prvi put kada se servis kreira. Ovde se vrši inicijalizacija.
  • onStartCommand() / metoda koja se poziva pri povezivanju (npr. onBind()): onStartCommand() se poziva pri pokretanju servisa metodom startService(). Vraća zastavicu koja ukazuje kako sistem treba da ponovo pokrene servis ako bude uništen. onBind() se poziva pri povezivanju klijenta sa servisom metodom bindService().
  • onDestroy(): Poziva se kada se servis uništi. Ovde se oslobađaju svi resursi.

Postoje dve vrste servisa koje utiču na životni ciklus:

  • Pokrenuti servis (Started Service): Pokreće se metodom startService(). Radi dok ga ne zaustavi eksplicitno metodom stopSelf() ili stopService(). Sistem će pokušati da ga ponovo pokrene nakon uništenja ako je onStartCommand() vratio odgovarajuću zastavicu.
  • Povezani servis (Bound Service): Pokreće se metodom bindService(). Postoji dok je bar jedan aktivni klijent povezan. Kada se svi klijenti odvežu, servis se uništava. onBind() vraća implementaciju IBinder koja se koristi za interakciju sa servisom.

Grafik životnog ciklusa:

        Start Service --+--> onStartCommand() --+--> Pokrenut
                        |                         |
        Bind Service ---+--> onBind() -----------+--> Povezan
                        |
        onCreate() -----+
                        |
                        +--> onRebind()
                        |
        onDestroy() <---+-------------------------+---- Odvezan <--- unbindService()
                                                 |
                                                 +---- Zaustavljen <--- stopSelf() / stopService()

Ključne tačke:

  • onCreate() se poziva samo jednom.
  • onStartCommand() može biti pozvan više puta, ako se startService() poziva više puta.
  • Servis radi u glavnom thread-u UI po podrazumevanom. Duge operacije treba da se izvršavaju u posebnom thread-u ili korišćenjem IntentService.
  • Servisi sa povezivanjem imaju složeniji životni ciklus, koji zavisi od stanja klijenata.

Primer onStartCommand():

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // Izvršiti neke radnje
    // Na primer, pokrenuti pozadinski rad
    
    // Vraća zastavicu koja određuje ponašanje pri uništenju servisa
    return START_STICKY; // Servis će biti obnovljen ako je uništen
}

Primer onBind():

private final IBinder binder = new LocalBinder();

public class LocalBinder extends Binder {
    MyService getService() {
        // Vraća instancu servisa za klijente
        return MyService.this;
    }
}

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

@Override
public boolean onUnbind(Intent intent) {
    // Poziva se kada se svi klijenti odvežu
    return super.onUnbind(intent);
}