Sobes.tech
Middle

Kāds ir pakalpojumu dzīves cikls Android?

sobes.tech AI

Atbilde no AI

Pakalpojums nav ar lietotāja saskarni (UI) un darbojas fonā. Tā dzīves cikls tiek pārvaldīts ar trim galvenajām metodēm:

  • onCreate(): tiek izsaukta pirmo reizi, kad pakalpojums tiek izveidots. Šeit notiek inicializācija.
  • onStartCommand() / metode, kas tiek izsaukta, piesaistot (piemēram, onBind()): onStartCommand() tiek izsaukta, kad pakalpojums tiek palaists ar startService(). Tā atgriež karogu, kas norāda, kā sistēma jāatjauno pakalpojums, ja tas tiks iznīcināts. onBind() tiek izsaukta, piesaistot klientu ar bindService().
  • onDestroy(): tiek izsaukta, kad pakalpojums tiek iznīcināts. Šeit tiek atbrīvoti visi resursi.

Pastāv divu veidu pakalpojumi, kas ietekmē dzīves ciklu:

  • Sāktais pakalpojums (Started Service): tiek palaists ar startService(). Darbojas līdz brīdim, kad tas tiek tieši apturēts ar stopSelf() vai stopService(). Sistēma mēģinās to atsākt pēc iznīcināšanas, ja onStartCommand() atgrieza atbilstošu karogu.
  • Piesaistītais pakalpojums (Bound Service): tiek palaists ar bindService(). Pastāv tik ilgi, kamēr tam ir piesaistīts vismaz viens aktīvs klients. Kad visi klienti atvienojas, pakalpojums tiek iznīcināts. onBind() atgriež IBinder realizāciju, kas tiek izmantota ar pakalpojumu saziņai.

Dzīves cikla diagramma:

        Start Service --+--> onStartCommand() --+--> Darbojas
                        |                         |
        Bind Service ---+--> onBind() -----------+--> Piesaistīts
                        |
        onCreate() -----+
                        |
                        +--> onRebind()
                        |
        onDestroy() <---+-------------------------+---- Atvienots <--- unbindService()
                                                 |
                                                 +---- Apturēts <--- stopSelf() / stopService()

Galvenie punkti:

  • onCreate() tiek izsaukta tikai vienu reizi.
  • onStartCommand() var tikt izsaukta vairākkārt, ja startService() tiek izsaukts atkārtoti.
  • Pakalpojums darbojas galvenajā UI pavedienā pēc noklusējuma. Ilgstošas operācijas jāveic atsevišķā pavedienā vai ar IntentService palīdzību.
  • Piesaistītie pakalpojumi ir ar sarežģītāku dzīves ciklu, kas ir atkarīgs no klientu stāvokļa.

Piemērs onStartCommand():

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // Veikt kādas darbības
    // Piemēram, sākt fonu darbu
    
    // Atgriezt karogu, kas nosaka, kā sistēma jāatjauno pakalpojums, ja tas tiks iznīcināts
    return START_STICKY; // Pakalpojums tiks atjaunots, ja tas tiks iznīcināts
}

Piemērs onBind():

private final IBinder binder = new LocalBinder();

public class LocalBinder extends Binder {
    MyService getService() {
        // Atgriež pakalpojuma instanci klientiem
        return MyService.this;
    }
}

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

@Override
public boolean onUnbind(Intent intent) {
    // Tiek izsaukta, kad visi klienti ir atvienoti
    return super.onUnbind(intent);
}