Sobes.tech
Middle

Wat is de levenscyclus van services in Android?

sobes.tech AI

Antwoord van AI

De service heeft geen gebruikersinterface en draait op de achtergrond. De levenscyclus wordt beheerd door drie hoofdmethoden:

  • onCreate(): Wordt voor het eerst aangeroepen wanneer de service wordt gemaakt. Hier wordt de initialisatie uitgevoerd.
  • onStartCommand() / methode die wordt aangeroepen bij koppeling (bijvoorbeeld, onBind()): onStartCommand() wordt aangeroepen bij het starten van de service via startService(). Het retourneert een vlag die aangeeft hoe het systeem de service moet herstellen als deze wordt beëindigd. onBind() wordt aangeroepen wanneer een client zich verbindt met de service via bindService().
  • onDestroy(): Wordt aangeroepen wanneer de service wordt vernietigd. Hier worden alle resources vrijgegeven.

Er zijn twee typen services die de levenscyclus beïnvloeden:

  • Gestarte Service (Started Service): Wordt gestart met startService(). Werkt totdat deze expliciet wordt gestopt met stopSelf() of stopService(). Het systeem probeert deze opnieuw te starten na vernietiging als onStartCommand() de juiste vlag heeft geretourneerd.
  • Gebonden Service (Bound Service): Wordt gestart met bindService(). Bestaat zolang ten minste één actieve client verbonden is. Wanneer alle clients de verbinding verbreken, wordt de service vernietigd. onBind() retourneert een implementatie van IBinder, die wordt gebruikt om met de service te communiceren.

Levenscyclusdiagram:

        Start Service --+--> onStartCommand() --+--> In uitvoering
                        |                         |
        Bind Service ---+--> onBind() -----------+--> Gebonden
                        |
        onCreate() -----+
                        |
                        +--> onRebind()
                        |
        onDestroy() <---+-------------------------+---- Verbonden <--- unbindService()
                                                 |
                                                 +---- Gestopt <--- stopSelf() / stopService()

Belangrijke punten:

  • onCreate() wordt slechts één keer aangeroepen.
  • onStartCommand() kan meerdere keren worden aangeroepen als startService() herhaaldelijk wordt aangeroepen.
  • De service draait standaard in de hoofdthread van de UI. Langdurige operaties moeten in een aparte thread of met behulp van IntentService worden uitgevoerd.
  • Gebonden services hebben een complexere levenscyclus die afhankelijk is van de toestand van de clients.

Voorbeeld van onStartCommand():

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // Voer acties uit
    // Bijvoorbeeld, start een achtergrondtaak
    
    // Retourneer de vlag die bepaalt hoe het systeem zich gedraagt bij het beëindigen
    return START_STICKY; // Service wordt hersteld als deze wordt beëindigd
}

Voorbeeld van onBind():

private final IBinder binder = new LocalBinder();

public class LocalBinder extends Binder {
    MyService getService() {
        // Retourneer de instantie van de service voor clients
        return MyService.this;
    }
}

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

@Override
public boolean onUnbind(Intent intent) {
    // Wordt aangeroepen wanneer alle clients de verbinding verbreken
    return super.onUnbind(intent);
}