Sobes.tech
Middle

Aký je životný cyklus služieb v Androide?

sobes.tech AI

Odpoveď od AI

Služba nemá používateľské rozhranie a beží na pozadí. Jej životný cyklus je riadený tromi hlavnými metódami:

  • onCreate(): Volá sa prvýkrát pri vytvorení služby. Tu sa vykonáva inicializácia.
  • onStartCommand() / metóda volaná pri pripájaní (napríklad onBind()): onStartCommand() sa volá pri spustení služby metódou startService(). Vráti vlajku, ktorá určuje, ako má systém službu obnoviť, ak bude ukončená. onBind() sa volá pri pripájaní klienta ku službe metódou bindService().
  • onDestroy(): Volá sa, keď je služba zničená. Tu sa uvoľňujú všetky zdroje.

Existujú dva typy služieb, ktoré ovplyvňujú životný cyklus:

  • Spustená služba (Started Service): Spúšťa sa metódou startService(). Funguje, kým nie je výslovne zastavená metódou stopSelf() alebo stopService(). Systém sa pokúsi ju znovu spustiť po zničení, ak onStartCommand() vrátila príslušnú vlajku.
  • Viazaná služba (Bound Service): Spúšťa sa metódou bindService(). Existuje, kým je k nej pripojený aspoň jeden aktívny klient. Keď sa všetci klienti odpoja, služba je zničená. onBind() vracia implementáciu IBinder, ktorá sa používa na interakciu so službou.

Graf životného cyklu:

        Start Service --+--> onStartCommand() --+--> Beží
                        |                         |
        Bind Service ---+--> onBind() -----------+--> Viazaná
                        |
        onCreate() -----+
                        |
                        +--> onRebind()
                        |
        onDestroy() <---+-------------------------+---- Odpojená <--- unbindService()
                                                 |
                                                 +---- Zastavená <--- stopSelf() / stopService()

Kľúčové body:

  • onCreate() sa volá iba raz.
  • onStartCommand() môže byť volaná mnohokrát, ak sa startService() volá opakovane.
  • Služba beží v hlavnom vlákne UI podľa predvoleného nastavenia. Dlhé operácie by mali byť vykonávané v samostatnom vlákne alebo s použitím IntentService.
  • Služby s viazaním majú zložitejší životný cyklus, ktorý závisí od stavu klientov.

Príklad onStartCommand():

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // Vykonať nejaké akcie
    // Napríklad spustiť pozadovú prácu
    
    // Vrátiť vlajku, ktorá určuje správanie pri zničení služby
    return START_STICKY; // Služba bude obnovená, ak bola ukončená
}

Príklad onBind():

private final IBinder binder = new LocalBinder();

public class LocalBinder extends Binder {
    MyService getService() {
        // Vrátiť inštanciu služby pre klientov
        return MyService.this;
    }
}

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

@Override
public boolean onUnbind(Intent intent) {
    // Volá sa, keď sa všetci klienti odpoja
    return super.onUnbind(intent);
}