Sobes.tech
Middle

Какво е фоновата услуга (услуга на преден план) в Android?

sobes.tech AI

Отговор от AI

Фоновият сервис (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
)

// В callback след получаване на разрешението или ако вече е налично
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()
}