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
)

// У колбеку після отримання права або якщо право вже є
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()
}