Sobes.tech
Junior

Ar kada nors naudojote Service Android?

sobes.tech AI

Atsakymas iš AI

Taip, naudojau. Service — tai programos komponentas, kuris gali vykdyti ilgalaikes operacijas fone, nesusijęs su vartotojo sąsaja. Service neturi savo UI.

Service gali veikti trijose būsenose:

  1. Started: Service paleidžiamas iškvietus startService(). Jis veikia nepriklausomai nuo komponento, kuris jį iškvietė. Paprastai naudojamas vienkartinėms operacijoms, pavyzdžiui, failo įkėlimui.
  2. Bound: Service paleidžiamas iškvietus bindService(). Jis yra susietas su komponentu, kuris jį iškvietė. Leidžia programos komponentams sąveikauti su Service. Service gyvuoja tol, kol prie jo yra prijungti komponentai.
  3. Foreground: Service paleidžiamas iškvietus startForeground(). Atlieka operacijas, kurios yra matomos vartotojui (pavyzdžiui, muzikos atkūrimas). Sistema mažiau linkusi naikinti foreground Service dėl atminties trūkumo. Reikalauja pranešimo.

Pagrindiniai gyvavimo ciklo metodai:

  • onCreate(): vykdomas pirmą kartą sukūrus Service.
  • onStartCommand() arba onBind(): priklausomai nuo paleidimo būdo.
    • onStartCommand(): iškviečiamas kiekvieną kartą, kai komponentas iškviečia startService().
    • onBind(): iškviečiamas iškvietus bindService(). Grąžina IBinder sąveikai.
  • onDestroy(): iškviečiamas prieš sunaikinant Service.

Pavyzdys — naudoti Started Service foninei užduočiai vykdyti:

class MyStartedService : Service() {

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        // Ilgalaikės operacijos vykdymas atskirame sraute
        Thread {
            // Pavyzdys: duomenų įkėlimas
            Log.d("MyStartedService", "Service started")
            try {
                Thread.sleep(5000) // Imituojama darbo
            } catch (e: InterruptedException) {
                Thread.currentThread().interrupt()
            }
            Log.d("MyStartedService", "Operation finished")
            stopSelf(startId) // Sustabdyti servisą po užduoties įvykdymo
        }.start()

        return START_STICKY // Arba START_NOT_STICKY, START_REDELIVER_INTENT
    }

    override fun onBind(intent: Intent?): IBinder? {
        return null // Ne naudojame bound Service
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d("MyStartedService", "Service destroyed")
    }
}

Ilgalaikėms operacijoms, reikalaujančioms garantijos įvykdymo ir veikimo atskirame procese, rekomenduojama naudoti WorkManager, kuris yra sukurtas ant Service pagrindo, bet siūlo patikimesnį ir lankstesnį API.