Middle
Koji je životni ciklus servisa u Androidu?
sobes.tech АИ
Одговор од АИ
Servis nema UI i radi u pozadini. Njegov životni ciklus upravlja se sa tri glavne metode:
onCreate(): Poziva se prvi put kada se servis kreira. Ovde se vrši inicijalizacija.onStartCommand()/ metoda koja se poziva pri povezivanju (npr.onBind()):onStartCommand()se poziva pri pokretanju servisa metodomstartService(). Vraća zastavicu koja ukazuje kako sistem treba da ponovo pokrene servis ako bude uništen.onBind()se poziva pri povezivanju klijenta sa servisom metodombindService().onDestroy(): Poziva se kada se servis uništi. Ovde se oslobađaju svi resursi.
Postoje dve vrste servisa koje utiču na životni ciklus:
- Pokrenuti servis (Started Service): Pokreće se metodom
startService(). Radi dok ga ne zaustavi eksplicitno metodomstopSelf()ilistopService(). Sistem će pokušati da ga ponovo pokrene nakon uništenja ako jeonStartCommand()vratio odgovarajuću zastavicu. - Povezani servis (Bound Service): Pokreće se metodom
bindService(). Postoji dok je bar jedan aktivni klijent povezan. Kada se svi klijenti odvežu, servis se uništava.onBind()vraća implementacijuIBinderkoja se koristi za interakciju sa servisom.
Grafik životnog ciklusa:
Start Service --+--> onStartCommand() --+--> Pokrenut
| |
Bind Service ---+--> onBind() -----------+--> Povezan
|
onCreate() -----+
|
+--> onRebind()
|
onDestroy() <---+-------------------------+---- Odvezan <--- unbindService()
|
+---- Zaustavljen <--- stopSelf() / stopService()
Ključne tačke:
onCreate()se poziva samo jednom.onStartCommand()može biti pozvan više puta, ako sestartService()poziva više puta.- Servis radi u glavnom thread-u UI po podrazumevanom. Duge operacije treba da se izvršavaju u posebnom thread-u ili korišćenjem IntentService.
- Servisi sa povezivanjem imaju složeniji životni ciklus, koji zavisi od stanja klijenata.
Primer onStartCommand():
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Izvršiti neke radnje
// Na primer, pokrenuti pozadinski rad
// Vraća zastavicu koja određuje ponašanje pri uništenju servisa
return START_STICKY; // Servis će biti obnovljen ako je uništen
}
Primer onBind():
private final IBinder binder = new LocalBinder();
public class LocalBinder extends Binder {
MyService getService() {
// Vraća instancu servisa za klijente
return MyService.this;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public boolean onUnbind(Intent intent) {
// Poziva se kada se svi klijenti odvežu
return super.onUnbind(intent);
}