Sobes.tech
Middle

Jaký je životní cyklus služeb v Androidu?

sobes.tech AI

Odpověď od AI

Služba nem má žádné uživatelské rozhraní a běží na pozadí. Její životní cyklus je řízen třemi hlavními metodami:

  • onCreate(): Volá se poprvé při vytváření služby. Zde se provádí inicializace.
  • onStartCommand() / metoda volaná při připojení (například onBind()): onStartCommand() je volána při spuštění služby metodou startService(). Vrací příznak, který určuje, jak má systém službu obnovit, pokud bude ukončena. onBind() je volána při připojení klienta ke službě metodou bindService().
  • onDestroy(): Volá se při zničení služby. Uvolňují se všechny zdroje.

Existují dva typy služeb ovlivňujících životní cyklus:

  • Startovaná služba (Started Service): Spouští se metodou startService(). Funguje, dokud není výslovně zastavena metodou stopSelf() nebo stopService(). Systém se pokusí ji znovu spustit po zničení, pokud onStartCommand() vrátila odpovídající příznak.
  • Vázaná služba (Bound Service): Spouští se metodou bindService(). Existuje, dokud je k ní připojen alespoň jeden aktivní klient. Když se všichni klienti odpojí, služba je zničena. onBind() vrací implementaci IBinder, která se používá ke komunikaci se službou.

Graf životního cyklu:

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

Klíčové body:

  • onCreate() je volána pouze jednou.
  • onStartCommand() může být volána mnohokrát, pokud je startService() volána opakovaně.
  • Služba běží ve hlavním vlákně UI podle výchozího nastavení. Dlouhotrvající operace by měly být prováděny v samostatném vlákně nebo s využitím IntentService.
  • Služby s vazbou mají složitější životní cyklus závislý na stavu klientů.

Příklad onStartCommand():

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // Provést nějaké akce
    // Například spustit práci na pozadí
    
    // Vrátit příznak určující chování při zničení služby
    return START_STICKY; // Služba bude obnovena, pokud byla ukončena
}

Příklad onBind():

private final IBinder binder = new LocalBinder();

public class LocalBinder extends Binder {
    MyService getService() {
        // Vrací instanci služby pro klienty
        return MyService.this;
    }
}

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

@Override
public boolean onUnbind(Intent intent) {
    // Volá se, když se všichni klienti odpojí
    return super.onUnbind(intent);
}