Sobes.tech
Junior

Kas olete kunagi kasutanud Androidis Service'i?

sobes.tech AI

Vastus AI-lt

Jah, kasutanud. Service — see on rakenduse komponent, mis võib täita pikaajalisi operatsioone taustal, mitte seotud kasutajaliidesega. Service ei oma oma UI.

Service võib töötada kolmes olekus:

  1. Started: Service käivitatakse startService() kutsumisega. See töötab sõltumatult sellest komponendist, mis selle käivitas. Tavaliselt kasutatakse ühekordsete operatsioonide jaoks, näiteks faili laadimiseks.
  2. Bound: Service käivitatakse bindService() kutsumisega. See on seotud selle komponendiga, mis selle kutsus. Annab rakenduse komponentidele võimaluse Service'iga suhelda. Service elab seni, kuni selle juurde on ühendatud komponendid.
  3. Foreground: Service käivitatakse startForeground() kutsumisega. Teostab operatsioone, mis on kasutajale nähtavad (näiteks muusika esitamine). Süsteem on vähem kaldu seda hävitama mälupuuduse tõttu. Nõuab teavitust.

Olulised elutsükli meetodid:

  • onCreate(): täidetakse esimese Service loomise ajal.
  • onStartCommand() või onBind(): sõltuvalt käivitamise viisist.
    • onStartCommand(): kutsutakse iga kord, kui komponent kutsub startService().
    • onBind(): kutsutakse, kui kutsutakse bindService(). Tagastab IBinder suhtlemiseks.
  • onDestroy(): kutsutakse enne Service hävitamist.

Näide — kasutada Started Service taustalöögi täitmiseks:

class MyStartedService : Service() {

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        // Pikaajalise operatsiooni täitmine eraldi niidil
        Thread {
            // Näide: andmete laadimine
            Log.d("MyStartedService", "Service started")
            try {
                Thread.sleep(5000) // Imiteerib tööd
            } catch (e: InterruptedException) {
                Thread.currentThread().interrupt()
            }
            Log.d("MyStartedService", "Operation finished")
            stopSelf(startId) // Teenuse lõpetamine pärast ülesande täitmist
        }.start()

        return START_STICKY // Või START_NOT_STICKY, START_REDELIVER_INTENT
    }

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

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

Pikaajaliste operatsioonide jaoks, mis nõuavad garantii täitmise ja töötamist eraldi protsessis, on soovitatav kasutada WorkManagerit, mis on üles ehitatud Service'i peale, kuid pakub usaldusväärsemat ja paindlikumat API-d.