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říkladonBind()):onStartCommand()je volána při spuštění služby metodoustartService(). 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ě metodoubindService().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 metodoustopSelf()nebostopService(). Systém se pokusí ji znovu spustit po zničení, pokudonStartCommand()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í implementaciIBinder, 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 jestartService()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);
}