Middle
Aký je životný cyklus služieb v Androide?
sobes.tech AI
Odpoveď od AI
Služba nemá používateľské rozhranie a beží na pozadí. Jej životný cyklus je riadený tromi hlavnými metódami:
onCreate(): Volá sa prvýkrát pri vytvorení služby. Tu sa vykonáva inicializácia.onStartCommand()/ metóda volaná pri pripájaní (napríkladonBind()):onStartCommand()sa volá pri spustení služby metódoustartService(). Vráti vlajku, ktorá určuje, ako má systém službu obnoviť, ak bude ukončená.onBind()sa volá pri pripájaní klienta ku službe metódoubindService().onDestroy(): Volá sa, keď je služba zničená. Tu sa uvoľňujú všetky zdroje.
Existujú dva typy služieb, ktoré ovplyvňujú životný cyklus:
- Spustená služba (Started Service): Spúšťa sa metódou
startService(). Funguje, kým nie je výslovne zastavená metódoustopSelf()alebostopService(). Systém sa pokúsi ju znovu spustiť po zničení, akonStartCommand()vrátila príslušnú vlajku. - Viazaná služba (Bound Service): Spúšťa sa metódou
bindService(). Existuje, kým je k nej pripojený aspoň jeden aktívny klient. Keď sa všetci klienti odpoja, služba je zničená.onBind()vracia implementáciuIBinder, ktorá sa používa na interakciu so službou.
Graf životného cyklu:
Start Service --+--> onStartCommand() --+--> Beží
| |
Bind Service ---+--> onBind() -----------+--> Viazaná
|
onCreate() -----+
|
+--> onRebind()
|
onDestroy() <---+-------------------------+---- Odpojená <--- unbindService()
|
+---- Zastavená <--- stopSelf() / stopService()
Kľúčové body:
onCreate()sa volá iba raz.onStartCommand()môže byť volaná mnohokrát, ak sastartService()volá opakovane.- Služba beží v hlavnom vlákne UI podľa predvoleného nastavenia. Dlhé operácie by mali byť vykonávané v samostatnom vlákne alebo s použitím IntentService.
- Služby s viazaním majú zložitejší životný cyklus, ktorý závisí od stavu klientov.
Príklad onStartCommand():
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Vykonať nejaké akcie
// Napríklad spustiť pozadovú prácu
// Vrátiť vlajku, ktorá určuje správanie pri zničení služby
return START_STICKY; // Služba bude obnovená, ak bola ukončená
}
Príklad onBind():
private final IBinder binder = new LocalBinder();
public class LocalBinder extends Binder {
MyService getService() {
// Vrátiť inštanciu služby pre klientov
return MyService.this;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public boolean onUnbind(Intent intent) {
// Volá sa, keď sa všetci klienti odpoja
return super.onUnbind(intent);
}