Sobes.tech
Middle

Čo je to služba na pozadí (služba v popredí) v Android?

sobes.tech AI

Odpoveď od AI

Backgroundová služba (foreground service) je typ služby v Androidu, ktorá má zvýšený prioritu a je viditeľná používateľovi. Vykonáva úlohy, ktoré sú pre používateľa zrejmé a nemali by byť prerušené pri úspore batérie alebo nedostatku pamäti.

Kľúčové charakteristiky:

  • Zobrazuje trvalé oznámenie v oblasti oznámení. Používateľ by mal mať možnosť vidieť, že služba beží, a potenciálne s ňou interagovať.
  • Systém s menšou pravdepodobnosťou ukončí foregroundovú službu v porovnaní s bežnou backgroundovou službou alebo vláknom kvôli jej vysokému prioritu.
  • Vyžaduje špeciálne povolenie FOREGROUND_SERVICE.
  • Používa sa pre úlohy ako prehrávanie hudby, sledovanie polohy, synchronizácia dát v reálnom čase.

Životný cyklus:

  1. Spustí sa pomocou startForegroundService().
  2. Do 5 sekúnd je potrebné zavolať startForeground(notificationId, notification) na prechod služby do background režimu. Inak systém môže službu zastaviť a vyhodiť ForegroundServiceDidNotStartInTimeException.
  3. Zastaví sa pomocou stopSelf() alebo stopService() z iného komponentu, alebo nútene používateľom cez oznámenie. Pri zastavení je potrebné zavolať stopForeground(bool removeNotification) na odstránenie oznámenia.

Príklad spustenia:

// Získanie práva
ActivityCompat.requestPermissions(
    this,
    arrayOf(Manifest.permission.FOREGROUND_SERVICE),
    REQUEST_CODE_FOREGROUND_SERVICE
)

// V callback po získaní práva alebo ak právo už je
val serviceIntent = Intent(this, MyForegroundService::class.java)
ContextCompat.startForegroundService(this, serviceIntent)

Vo vnútri služby:

// MyForegroundService.kt
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    val notification: Notification = createNotification() // Metóda na vytvorenie oznámenia
    startForeground(NOTIFICATION_ID, notification)
    // Tu začína vykonávanie úlohy služby
    return START_STICKY // Alebo iný vhodný príznak
}

override fun onDestroy() {
    stopForeground(true) // Odstrániť oznámenie pri zastavení
    // Uvoľnenie zdrojov
    super.onDestroy()
}