Sobes.tech
Middle

Šta je servis u pozadini (servis u prvom planu) u Androidu?

sobes.tech АИ

Одговор од АИ

Фонови сервис (foreground service) је тип сервиса у Android-у који има повећани приоритет и видљив је кориснику. Он извршава задатке који су приметни за корисника и не смеју бити прекинути ради уштеде батерије или меморије.

Кључне карактеристике:

  • Приказује константно обавештење у области обавештења. Корисник треба да може видети да је сервис покренут и потенцијално са њим комуницирати.
  • Систем је мање вероватно да ће прекинути сервис у првом плану у поређењу са обичним позадинским сервисом или потоком због његовог високог приоритета.
  • Захтева посебно одобрење FOREGROUND_SERVICE.
  • Користи се за задатке као што су репродукција музике, праћење локације, синхронизација података у реалном времену.

Животни циклус:

  1. Покреће се помоћу startForegroundService().
  2. У року од 5 секунди, потребно је позвати startForeground(notificationId, notification) да би се сервис прешао у први план. У супротном, систем може зауставити сервис и изазвати ForegroundServiceDidNotStartInTimeException.
  3. Зауставља се помоћу stopSelf() или stopService() из другог компонента, или принудно од стране корисника преко обавештења. При заустављању, потребно је позвати stopForeground(bool removeNotification) за уклањање обавештења.

Пример покретања:

// Добијање дозволе
ActivityCompat.requestPermissions(
    this,
    arrayOf(Manifest.permission.FOREGROUND_SERVICE),
    REQUEST_CODE_FOREGROUND_SERVICE
)

// У повратном позиву након добијања дозволе или ако већ постоји
val serviceIntent = Intent(this, MyForegroundService::class.java)
ContextCompat.startForegroundService(this, serviceIntent)

Унутар сервиса:

// MyForegroundService.kt
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    val notification: Notification = createNotification() // Метода за креирање обавештења
    startForeground(NOTIFICATION_ID, notification)
    // Овде почиње извршавање задатка сервиса
    return START_STICKY // Или други одговарајући флаг
}

override fun onDestroy() {
    stopForeground(true) // Уклањање обавештења при заустављању
    // Чишћење ресурса
    super.onDestroy()
}