Middle
Koks yra paslaugų gyvavimo ciklas Android?
sobes.tech AI
Atsakymas iš AI
Paslauga neturi UI ir veikia foniniame režime. Jos gyvavimo ciklas valdomas trimis pagrindinėmis metodais:
onCreate(): iškviečiama pirmą kartą, kai paslauga kuriama. Čia vykdoma inicializacija.onStartCommand()/ metodas, iškviečiamas prisijungimo metu (pvz.,onBind()):onStartCommand()iškviečiamas, kai paslauga paleidžiamastartService()metodu. Grąžina žymeklį, kuris nurodo, kaip sistema turėtų atnaujinti paslaugą, jei ji bus nutraukta.onBind()iškviečiamas, kai klientas jungiasi prie paslaugosbindService()metodu.onDestroy(): iškviečiamas, kai paslauga sunaikinama. Čia išlaisvinami visi ištekliai.
Yra du paslaugų tipai, kurie veikia gyvavimo ciklą:
- Paleista paslauga (Started Service): paleidžiama
startService()metodu. Veikia tol, kol nėra aiškiai sustabdytastopSelf()arbastopService()metodu. Sistema stengsis ją paleisti iš naujo po sunaikinimo, jeionStartCommand()grąžino atitinkamą žymeklį. - Susieta paslauga (Bound Service): paleidžiama
bindService()metodu. Egzistuoja tol, kol prie jos prisijungęs bent vienas aktyvus klientas. Kai visi klientai atjungia, paslauga sunaikinama.onBind()grąžinaIBinderįgyvendinimą, kuris naudojamas sąveikai su paslauga.
Gyvenimo ciklo schema:
Start Service --+--> onStartCommand() --+--> Veikia
| |
Bind Service ---+--> onBind() -----------+--> Susieta
|
onCreate() -----+
|
+--> onRebind()
|
onDestroy() <---+-------------------------+---- Atjungta <--- unbindService()
|
+---- Sustabdyta <--- stopSelf() / stopService()
Pagrindiniai punktai:
onCreate()iškviečiama tik vieną kartą.onStartCommand()gali būti iškviečiama daug kartų, jeistartService()yra kviečiama pakartotinai.- Paslauga veikia pagrindiniame UI sraute pagal numatytuosius nustatymus. Ilgalaikės operacijos turi būti vykdomos atskirame sraute arba naudojant
IntentService. - Susietos paslaugos turi sudėtingesnį gyvavimo ciklą, priklausomai nuo klientų būsenos.
Pavyzdys onStartCommand():
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Atlikti tam tikrus veiksmus
// Pvz., pradėti foninį darbą
// Grąžinti žymeklį, kuris nurodo, kaip elgtis, kai paslauga bus sunaikinta
return START_STICKY; // Paslauga bus atnaujinta, jei ji bus sunaikinta
}
Pavyzdys onBind():
private final IBinder binder = new LocalBinder();
public class LocalBinder extends Binder {
MyService getService() {
// Grąžinti paslaugos egzempliorių klientams
return MyService.this;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public boolean onUnbind(Intent intent) {
// Kviečiama, kai visi klientai atjungia
return super.onUnbind(intent);
}