Sobes.tech
Middle

Czym jest usługa w tle (usługa na pierwszym planie) w Androidzie?

sobes.tech AI

Odpowiedź od AI

Serwis w trybie pierwszoplanowym (foreground service) to typ serwisu w Androidzie, który ma wyższy priorytet i jest widoczny dla użytkownika. Wykonuje zadania, które są zauważalne dla użytkownika i nie powinny być przerywane w celu oszczędzania baterii lub pamięci.

Kluczowe cechy:

  • Wyświetla stałe powiadomienie w obszarze powiadomień. Użytkownik powinien widzieć, że serwis jest uruchomiony i potencjalnie z nim wchodzić w interakcję.
  • System ma mniejsze prawdopodobieństwo zakończenia serwisu w trybie pierwszoplanowym w porównaniu do zwykłego serwisu w tle lub wątku, ze względu na jego wysoki priorytet.
  • Wymaga specjalnego pozwolenia FOREGROUND_SERVICE.
  • Używany do zadań takich jak odtwarzanie muzyki, śledzenie lokalizacji, synchronizacja danych w czasie rzeczywistym.

Cykl życia:

  1. Uruchamia się za pomocą startForegroundService().
  2. W ciągu 5 sekund należy wywołać startForeground(notificationId, notification) w celu przeniesienia serwisu w tryb pierwszoplanowy. W przeciwnym razie system może zatrzymać serwis i rzucić ForegroundServiceDidNotStartInTimeException.
  3. Zatrzymuje się za pomocą stopSelf() lub stopService() z innego komponentu albo wymuszenie przez użytkownika przez powiadomienie. Przy zatrzymaniu należy wywołać stopForeground(bool removeNotification) w celu usunięcia powiadomienia.

Przykład uruchomienia:

// Uzyskanie uprawnienia
ActivityCompat.requestPermissions(
    this,
    arrayOf(Manifest.permission.FOREGROUND_SERVICE),
    REQUEST_CODE_FOREGROUND_SERVICE
)

// W callback po uzyskaniu uprawnienia lub jeśli już je posiadasz
val serviceIntent = Intent(this, MyForegroundService::class.java)
ContextCompat.startForegroundService(this, serviceIntent)

Wewnątrz serwisu:

// MyForegroundService.kt
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    val notification: Notification = createNotification() // Metoda tworząca powiadomienie
    startForeground(NOTIFICATION_ID, notification)
    // Tu zaczyna się wykonywanie zadania serwisu
    return START_STICKY // Lub inny odpowiedni flag
}

override fun onDestroy() {
    stopForeground(true) // Usunięcie powiadomienia przy zatrzymaniu
    // Czyszczenie zasobów
    super.onDestroy()
}