Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Работа с Service в Android
Что такое Service?
Service — это компонент Android, который выполняет долгоживущие операции в фоне без пользовательского интерфейса. Используется для операций, которые должны продолжаться, даже если приложение свёрнуто.
Типы Service
Started Service — запускается командой startService()
- Работает до явной остановки
- Нет прямого взаимодействия с запустившим компонентом
- Примеры: загрузка музыки, синхронизация данных
Bound Service — запускается bindService()
- Клиент может взаимодействовать с Service через интерфейс
- Живёт, пока есть привязанные клиенты
- Примеры: плеер, GPS позиционирование
Реализация Started Service
class MusicService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
// Задача выполняется в фоновом потоке
Thread {
playMusic()
}.start()
// START_STICKY — перезапустить Service при крахе системы
return START_STICKY
}
override fun onBind(intent: Intent?): IBinder? = null
private fun playMusic() {
// Музыка играет в фоне
}
}
Запуск из Activity:
val intent = Intent(this, MusicService::class.java)
startService(intent)
Реализация Bound Service
class LocationService : Service() {
private val binder = LocationBinder()
inner class LocationBinder : Binder() {
fun getService(): LocationService = this@LocationService
}
override fun onBind(intent: Intent?): IBinder = binder
fun getCurrentLocation(): String = "52.5200, 13.4050"
}
Подключение из Activity:
class MapActivity : AppCompatActivity() {
private lateinit var locationService: LocationService
private var bound = false
private val connection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
val binder = service as LocationService.LocationBinder
locationService = binder.getService()
bound = true
}
override fun onServiceDisconnected(name: ComponentName?) {
bound = false
}
}
override fun onStart() {
super.onStart()
val intent = Intent(this, LocationService::class.java)
bindService(intent, connection, Context.BIND_AUTO_CREATE)
}
override fun onStop() {
super.onStop()
n if (bound) {
unbindService(connection)
}
}
}
Foreground Service (Android 8+)
Для важных операций нужно уведомление:
class DownloadService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val notification = NotificationCompat.Builder(this, "channel_id")
.setContentTitle("Загрузка файла")
.setSmallIcon(R.drawable.ic_download)
.build()
startForeground(1, notification)
return START_STICKY
}
}
WorkManager вместо Service (Современный подход)
Для периодических фоновых задач лучше использовать WorkManager:
class SyncWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
return try {
syncData()
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
// Запуск
val syncTask = PeriodicWorkRequestBuilder<SyncWorker>(
15, TimeUnit.MINUTES
).build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
"sync",
ExistingPeriodicWorkPolicy.KEEP,
syncTask
)
Когда использовать
Service:
- Длительные операции (загрузка, музыка)
- Взаимодействие между компонентами
- Фоновые операции, требующие частого обновления
WorkManager:
- Периодические синхронизации
- Гарантированное выполнение
- Автоматическое расписание в зависимости от батареи
Ключевые правила
- Service работает в главном потоке — используй Thread/Coroutine
- Foreground Service нужен для видимых операций (Android 8+)
- Объявить в AndroidManifest.xml
- Не забыть unbindService() при отключении
- WorkManager предпочтительнее для простых задач