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 viastartService(). 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 viabindService().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 metstopSelf()ofstopService(). Het systeem probeert deze opnieuw te starten na vernietiging alsonStartCommand()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 vanIBinder, 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 alsstartService()herhaaldelijk wordt aangeroepen.- De service draait standaard in de hoofdthread van de UI. Langdurige operaties moeten in een aparte thread of met behulp van
IntentServiceworden 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);
}