Sobes.tech
Junior

Da li ste ikada koristili Service u razvoju Android aplikacija?

sobes.tech АИ

Одговор од АИ

Da, koristio sam. Service u Androidu se koristi za izvršavanje dugotrajnih operacija u pozadini bez korisničkog interfejsa.

Glavni scenariji korišćenja:

  • Reprodukcija muzike u pozadini.
  • Preuzimanje fajlova.
  • Sinhronizacija podataka sa serverom.
  • Praćenje lokacije.

Tipovi Service:

  • Started Service: Pokreće se od strane komponenti aplikacije (npr. Activity) i radi nezavisno. Zaustavlja se metodama stopSelf() ili stopService().
  • Bound Service: Pruža klijent-server interfejs. Komponente se povezuju sa Service putem bindService() i komuniciraju preko IBinder. Zaustavlja se kada se odvežu svi klijenti.
  • Foreground Service: Obavlja operacije koje su vidljive korisniku (npr. reprodukcija muzike). Pokreće se pomoću startForeground() i zahteva obaveštenje. Sistem ređe zatvara takav Service.

Životni ciklus Started Service:

  1. onCreate(): Kreiranje Service.
  2. onStartCommand(): Poziva se pri svakom zahtevu za pokretanje Service.
  3. onDestroy(): Uništavanje Service.

Životni ciklus Bound Service:

  1. onCreate(): Kreiranje Service.
  2. onBind(): Poziva se pri povezivanju klijenta sa Service. Vraća IBinder.
  3. onUnbind(): Poziva se pri odvezi svih klijenata.
  4. onDestroy(): Uništavanje Service.

Primer pokretanja Started Service:

// MainActivity.kt
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            // Vaš UI
            // Primer pokretanja Service
            val serviceIntent = Intent(this, MyStartedService::class.java)
            startService(serviceIntent)
        }
    }
}

Primer jednostavnog Started Service:

// MyStartedService.kt
import android.app.Service
import android.content.Intent
import android.os.IBinder
import android.util.Log

class MyStartedService : Service() {

    private val TAG = "MyStartedService"

    override fun onCreate() {
        super.onCreate()
        Log.d(TAG, "onCreate")
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        Log.d(TAG, "onStartCommand")
        // Izvršavanje dugotrajne operacije u pozadini
        Thread {
            for (i in 0..10) {
                Log.d(TAG, "Iteracija $i")
                try {
                    Thread.sleep(1000)
                } catch (e: InterruptedException) {
                    e.printStackTrace()
                }
            }
            stopSelf() // Zaustavljanje Service nakon završetka zadatka
        }.start()

        return START_STICKY // Ponovo pokrenuti Service ako ga sistem zatvori
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d(TAG, "onDestroy")
    }

    override fun onBind(intent: Intent?): IBinder? {
        // Za Started Service vraćamo null
        return null
    }
}

Važno je zapamtiti da Service po defaultu radi u glavnom thread-u. Za izvršavanje dugotrajnih, blokirajućih operacija potrebno je koristiti posebne niti ili Kotlin korutine da se izbegne blokiranje UI.

Prilikom rada sa dugotrajnim zadacima, preporučuje se korišćenje WorkManager-a, koji pruža fleksibilniji i pouzdaniji pristup za izvršavanje odloženih i garantovanih zadataka. WorkManager uzima u obzir sistemska ograničenja i upravlja izvršavanjem zadataka čak i ako je aplikacija zatvorena ili je uređaj restartovan.