Sobes.tech
Middle

Milline on Androidi teenuste elutsükkel?

sobes.tech AI

Vastus AI-lt

Teenusel ei oma UI-d ja töötab taustal. Selle elutsükkel juhitakse kolme peamise meetodiga:

  • onCreate(): kutsutakse esimest korda, kui teenus luuakse. Siin toimub initsialiseerimine.
  • onStartCommand() / meetod, mida kutsutakse sidumise ajal (näiteks onBind()): onStartCommand() kutsutakse, kui teenus käivitatakse startService() meetodiga. See tagastab lipu, mis näitab, kuidas süsteem peaks teenust taastama, kui see tapetakse. onBind() kutsutakse, kui klient ühendub teenusega bindService() meetodiga.
  • onDestroy(): kutsutakse, kui teenus hävitatakse. Siin vabastatakse kõik ressursid.

On olemas kaks teenuse tüüpi, mis mõjutavad elutsüklit:

  • Algatatud teenus (Started Service): käivitatakse startService() meetodiga. Töötab seni, kuni see on selgelt peatatud stopSelf() või stopService() meetodiga. Süsteem püüab seda taaskäivitada pärast hävitamist, kui onStartCommand() tagastas sobiva lipu.
  • Sidus teenus (Bound Service): käivitatakse bindService() meetodiga. Eksisteerib seni, kuni vähemalt üks aktiivne klient on ühendatud. Kui kõik kliendid lahti ühenduvad, hävitatakse teenus. onBind() tagastab IBinder realiseeringu, mida kasutatakse teenusega suhtlemiseks.

Elutsükli diagramm:

        Start Service --+--> onStartCommand() --+--> Käivitatud
                        |                         |
        Bind Service ---+--> onBind() -----------+--> Sidus
                        |
        onCreate() -----+
                        |
                        +--> onRebind()
                        |
        onDestroy() <---+-------------------------+---- Lahti ühendatud <--- unbindService()
                                                 |
                                                 +---- Peatatud <--- stopSelf() / stopService()

Peamised punktid:

  • onCreate() kutsutakse ainult kord.
  • onStartCommand() võib kutsuda kordades, kui startService() kutsutakse uuesti.
  • Teenus töötab peamise UI-voo peal vaikimisi. Pikaajalised operatsioonid peaksid toimuma eraldi niidil või kasutades IntentService.
  • Piesaistatud teenustel on keerulisem elutsükkel, mis sõltub klientide olekust.

Näide onStartCommand():

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // Teha mõningaid toiminguid
    // Näiteks alustada taustatööd
    
    // Tagastada lipu, mis määrab, kuidas süsteem peaks teenust taastama, kui see hävitatakse
    return START_STICKY; // Teenus taastatakse, kui see tapetakse
}

Näide onBind():

private final IBinder binder = new LocalBinder();

public class LocalBinder extends Binder {
    MyService getService() {
        // Tagastame teenuse eksemplari klientidele
        return MyService.this;
    }
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return binder;
}

@Override
public boolean onUnbind(Intent intent) {
    // Tõrjutakse, kui kõik kliendid on lahti ühendatud
    return super.onUnbind(intent);
}