Sobes.tech
Middle

Mi az Android szolgáltatások életciklusa?

sobes.tech MI

Válasz az MI-től

A szolgáltatásnak nincs UI-ja, és háttérmódban működik. Az életciklusa három fő módszerrel kezelhető:

  • onCreate(): Első alkalommal hívódik meg, amikor a szolgáltatás létrejön. Itt történik a inicializálás.
  • onStartCommand() / metódus, amit a csatlakozáskor hívnak meg (pl. onBind()): A onStartCommand() akkor hívódik meg, amikor a startService() metódussal indítják a szolgáltatást. Visszaad egy zászlót, ami megmondja, hogyan kell az rendszernek újraindítani a szolgáltatást, ha az megsemmisül. A onBind() akkor hívódik, amikor a kliens csatlakozik a szolgáltatáshoz a bindService()-el.
  • onDestroy(): Akkor hívódik, amikor a szolgáltatás megsemmisül. Itt szabadulnak fel az erőforrások.

Két típusú szolgáltatás létezik, amelyek befolyásolják az életciklust:

  • Indított szolgáltatás (Started Service): A startService() metódussal indítják. Akkor fut, amíg explicit módon nem állítják le a stopSelf() vagy stopService()-el. A rendszer megpróbálja újraindítani, ha megsemmisül, ha az onStartCommand() visszaadta a megfelelő zászlót.
  • Kötött szolgáltatás (Bound Service): A bindService()-el indítják. Akkor fut, amíg legalább egy aktív kliens csatlakozik hozzá. Amikor minden kliens leválik, a szolgáltatás megsemmisül. Az onBind() egy IBinder-t ad vissza, amit a szolgáltatással való interakcióra használnak.

Életciklus diagram:

        Start Service --+--> onStartCommand() --+--> Futtatás
                        |                         |
        Bind Service ---+--> onBind() -----------+--> Kötött
                        |
        onCreate() -----+
                        |
                        +--> onRebind()
                        |
        onDestroy() <---+-------------------------+---- Leválasztva <--- unbindService()
                                                 |
                                                 +---- Leállítva <--- stopSelf() / stopService()

Főbb pontok:

  • onCreate() csak egyszer hívódik meg.
  • onStartCommand() többször is meghívható, ha a startService() többször is hívják.
  • A szolgáltatás az alapértelmezett módon a fő UI szálon fut. Hosszú futó műveleteket külön szálon vagy az IntentService segítségével kell végrehajtani.
  • A kötött szolgáltatásoknak összetettebb életciklusa van, ami a kliensek állapotától függ.

Példa onStartCommand():

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // Valamilyen művelet végrehajtása
    // Például háttérmunka indítása
    
    // Visszaad egy zászlót, ami meghatározza a rendszer viselkedését a szolgáltatás megsemmisítésekor
    return START_STICKY; // A szolgáltatás újraindul, ha megsemmisült
}

Példa onBind():

private final IBinder binder = new LocalBinder();

public class LocalBinder extends Binder {
    MyService getService() {
        // A szolgáltatás példányának visszaadása a kliensek számára
        return MyService.this;
    }
}

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

@Override
public boolean onUnbind(Intent intent) {
    // Akkor hívódik, amikor minden kliens leválasztódik
    return super.onUnbind(intent);
}