Sobes.tech
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žiama startService() metodu. Grąžina žymeklį, kuris nurodo, kaip sistema turėtų atnaujinti paslaugą, jei ji bus nutraukta. onBind() iškviečiamas, kai klientas jungiasi prie paslaugos bindService() 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 sustabdyta stopSelf() arba stopService() metodu. Sistema stengsis ją paleisti iš naujo po sunaikinimo, jei onStartCommand() 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ąžina IBinder į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ų, jei startService() 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);
}