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:
- Spustí sa pomocou
startForegroundService(). - 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. - Zastaví sa pomocou
stopSelf()alebostopService()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()
}