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:
- Uruchamia się za pomocą
startForegroundService(). - 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. - Zatrzymuje się za pomocą
stopSelf()lubstopService()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()
}