Sobes.tech
Middle

Co je to služba na pozadí (služba na popředí) v Androidu?

sobes.tech AI

Odpověď od AI

Servis v popředí (foreground service) je typ služby v Androidu, která má vyšší prioritu a je viditelná uživateli. Provádí úkoly, které jsou pro uživatele patrné, a neměly by být přerušovány za účelem úspory baterie nebo paměti.

Klíčové vlastnosti:

  • Zobrazuje trvalé oznámení v oznamovací oblasti. Uživatel by měl vidět, že služba běží, a případně s ní komunikovat.
  • Systém má menší pravděpodobnost ukončení služby v popředí ve srovnání s běžnou službou na pozadí nebo vláknem, díky její vysoké prioritě.
  • Vyžaduje speciální oprávnění FOREGROUND_SERVICE.
  • Používá se pro úkoly jako přehrávání hudby, sledování polohy, synchronizace dat v reálném čase.

Životní cyklus:

  1. Spouští se pomocí startForegroundService().
  2. Během 5 sekund je nutné zavolat startForeground(notificationId, notification), aby se služba přesunula do popředí. Jinak může systém službu ukončit a vyhodit ForegroundServiceDidNotStartInTimeException.
  3. Ukončuje se pomocí stopSelf() nebo stopService() z jiného komponentu, nebo nuceně uživatelem přes oznámení. Při ukončení je nutné zavolat stopForeground(bool removeNotification) pro odstranění oznámení.

Příklad spuštění:

// Získání oprávnění
ActivityCompat.requestPermissions(
    this,
    arrayOf(Manifest.permission.FOREGROUND_SERVICE),
    REQUEST_CODE_FOREGROUND_SERVICE
)

// V callbacku po získání oprávnění nebo pokud již je
val serviceIntent = Intent(this, MyForegroundService::class.java)
ContextCompat.startForegroundService(this, serviceIntent)

Uvnitř služby:

// MyForegroundService.kt
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    val notification: Notification = createNotification() // Metoda pro vytvoření oznámení
    startForeground(NOTIFICATION_ID, notification)
    // Zde začíná vykonávání úkolu služby
    return START_STICKY // Nebo jiný vhodný příznak
}

override fun onDestroy() {
    stopForeground(true) // Odstranit oznámení při ukončení
    // Uvolnění zdrojů
    super.onDestroy()
}