Sobes.tech
Junior

Ar kada nors naudojote Service Android programų kūrime?

sobes.tech AI

Atsakymas iš AI

Taip, naudoju. Service Android'e naudojamas ilgalaikių operacijų vykdymui fone be vartotojo sąsajos.

Pagrindiniai naudojimo scenarijai:

  • Muzikos atkūrimas fone.
  • Failų atsisiuntimas.
  • Duomenų sinchronizavimas su serveriu.
  • Vietovės stebėjimas.

Service tipai:

  • Started Service: paleidžiamas programos komponento (pvz., Activity) ir veikia nepriklausomai. Sustabdomas stopSelf() arba stopService() metodu.
  • Bound Service: teikia klientas-serverio sąsają. Komponentai jungiasi prie Service per bindService() ir sąveikauja per IBinder. Sustabdomas, kai visi klientai atjungia.
  • Foreground Service: vykdo operacijas, kurios matomos vartotojui (pvz., muzikos atkūrimas). Paleidžiamas naudojant startForeground() ir reikalauja pranešimo. Sistema rečiau užbaigia tokį Service.

Started Service gyvavimo ciklas:

  1. onCreate(): Service sukūrimas.
  2. onStartCommand(): iškviečiamas kiekvieną kartą, kai prašoma pradėti Service.
  3. onDestroy(): Service sunaikinimas.

Bound Service gyvavimo ciklas:

  1. onCreate(): Service sukūrimas.
  2. onBind(): iškviečiamas jungiantis klientui prie Service. Grąžina IBinder.
  3. onUnbind(): iškviečiamas atjungus visus klientus.
  4. onDestroy(): Service sunaikinimas.

Pavyzdys, kaip pradėti 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 {
            // Jūsų UI
            // Pavyzdys, kaip pradėti Service
            val serviceIntent = Intent(this, MyStartedService::class.java)
            startService(serviceIntent)
        }
    }
}

Paprasto Started Service pavyzdys:

// 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")
        // Ilgalaikės operacijos vykdymas fone
        Thread {
            for (i in 0..10) {
                Log.d(TAG, "Iteracija $i")
                try {
                    Thread.sleep(1000)
                } catch (e: InterruptedException) {
                    e.printStackTrace()
                }
            }
            stopSelf() // Service sustabdymas po užbaigimo
        }.start()

        return START_STICKY // Service paleidžiamas iš naujo, jei sistema jį užbaigs
    }

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

    override fun onBind(intent: Intent?): IBinder? {
        // Started Service grąžina null
        return null
    }
}

Svarbu atkreipti dėmesį, kad Service pagal numatytuosius nustatymus veikia pagrindiniame sraute. Ilgalaikių, blokuojančių operacijų vykdymui būtina naudoti atskirus srautus arba Kotlin协рoutines, kad būtų išvengta UI užšalimo.

Ilgalaikių užduočių vykdymui rekomenduojama naudoti WorkManager, kuris siūlo lankstesnį ir patikimesnį būdą vykdyti uždelstas ir garantuotas užduotis. WorkManager atsižvelgia į sistemos apribojimus ir valdo užduočių vykdymą, net jei programa yra uždaryta arba įrenginys perkrautas.