Sobes.tech
Junior

Použili ste niekedy Service v Android?

sobes.tech AI

Odpoveď od AI

Áno, používal som. Service — je komponenta aplikácie, ktorá môže vykonávať dlhé operácie na pozadí, bez väzby na používateľské rozhranie. Service nemá vlastné UI.

Service môže pracovať v troch stavoch:

  1. Started: Service sa spustí volaním startService(). Beží nezávisle od komponentu, ktorý ho spustil. Zvyčajne sa používa na jednorazové operácie, napríklad načítanie súboru.
  2. Bound: Service sa spustí volaním bindService(). Je viazaný na komponent, ktorý ho volal. Umožňuje komponentom aplikácie komunikovať so Service. Service existuje, kým sú k nemu pripojené komponenty.
  3. Foreground: Service sa spustí volaním startForeground(). Vykonáva operácie, ktoré sú viditeľné pre používateľa (napríklad prehrávanie hudby). Systém je menej náchylný na ukončenie foreground Service kvôli nedostatku pamäte. Vyžaduje oznámenie.

Kľúčové metódy životného cyklu:

  • onCreate(): Vykoná sa pri prvom vytvorení Service.
  • onStartCommand() alebo onBind(): V závislosti od spôsobu spustenia.
    • onStartCommand(): Volá sa zakaždým, keď komponent volá startService().
    • onBind(): Volá sa pri volaní bindService(). Vráti IBinder na interakciu.
  • onDestroy(): Volá sa pred zničením Service.

Príklad použitia Started Service na vykonanie pozadinskej úlohy:

class MyStartedService : Service() {

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        // Vykonanie dlhodobej operácie v samostatnom vlákne
        Thread {
            // Príklad: načítanie dát
            Log.d("MyStartedService", "Service started")
            try {
                Thread.sleep(5000) // Napodobnenie práce
            } catch (e: InterruptedException) {
                Thread.currentThread().interrupt()
            }
            Log.d("MyStartedService", "Operation finished")
            stopSelf(startId) // Zastavenie služby po vykonaní úlohy
        }.start()

        return START_STICKY // Alebo START_NOT_STICKY, START_REDELIVER_INTENT
    }

    override fun onBind(intent: Intent?): IBinder? {
        return null // Nepoužívame bound Service
    }

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

Pre dlhé operácie, ktoré vyžadujú záruku vykonania a prácu v samostatnom procese, je vhodné použiť WorkManager, ktorý je postavený na Service, ale poskytuje spoľahlivejšie a flexibilnejšie API.