Sobes.tech
Junior

Kas olete kunagi kasutanud Service'i Android rakenduste arendamisel?

sobes.tech AI

Vastus AI-lt

Jah, ma kasutan. Service Androidis kasutatakse pikaajaliste operatsioonide taustal täitmiseks ilma kasutajaliideseta.

Peamised kasutusstsenaariumid:

  • Muusika taustal mängimine.
  • Failide allalaadimine.
  • Andmete sünkroonimine serveriga.
  • Asukoha jälgimine.

Service tüübid:

  • Started Service: käivitatakse rakenduse komponendi (näiteks Activity) poolt ja töötab sõltumatult. Peatub stopSelf() või stopService() meetodiga.
  • Bound Service: pakub klient-serveri liidest. Komponendid ühenduvad Service'iga bindService() kaudu ja suhtlevad IBinder kaudu. Peatub, kui kõik kliendid on lahti ühendatud.
  • Foreground Service: täidab operatsioone, mis on kasutajale nähtavad (näiteks muusika esitamine). Käivitatakse startForeground() abil ja nõuab teavitust. Süsteem lõpetab sellise Service harvemini.

Started Service elutsükkel:

  1. onCreate(): Service loomine.
  2. onStartCommand(): kutsutakse iga kord, kui Service käivitatakse.
  3. onDestroy(): Service hävitamine.

Bound Service elutsükkel:

  1. onCreate(): Service loomine.
  2. onBind(): kutsutakse, kui klient ühendub Service'iga. Tagastab IBinder.
  3. onUnbind(): kutsutakse, kui kõik kliendid on lahti ühendatud.
  4. onDestroy(): Service hävitamine.

Näide, kuidas käivitada 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 {
            // Teie UI
            // Näide Service'i käivitamisest
            val serviceIntent = Intent(this, MyStartedService::class.java)
            startService(serviceIntent)
        }
    }
}

Lihtne Started Service näide:

// 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")
        // Pikaajalise operatsiooni täitmine taustal
        Thread {
            for (i in 0..10) {
                Log.d(TAG, "Iteratsioon $i")
                try {
                    Thread.sleep(1000)
                } catch (e: InterruptedException) {
                    e.printStackTrace()
                }
            }
            stopSelf() // Service'i peatamine pärast ülesande lõpetamist
        }.start()

        return START_STICKY // Service'i taasalustamine, kui see süsteemi poolt tapetakse
    }

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

    override fun onBind(intent: Intent?): IBinder? {
        // Started Service'ile tagastame null
        return null
    }
}