Ответ
Service — компонент Android для выполнения длительных операций в фоне без пользовательского интерфейса.
Два основных типа:
-
Started Service (Запущенный сервис)
- Запускается вызовом
startService()из Activity или другого компонента. - Работает независимо от запустившего его компонента.
- Должен быть явно остановлен вызовом
stopSelf()илиstopService().
- Запускается вызовом
-
Bound Service (Связанный сервис)
- Создаёт клиент-серверное взаимодействие через
bindService(). - Работает, пока есть хотя бы один привязанный клиент.
- Все клиенты отвязываются — сервис уничтожается системой.
- Создаёт клиент-серверное взаимодействие через
Пример объявления простого Started Service:
public class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Выполнение фоновой задачи
return START_STICKY; // Поведение при убийстве системой
}
@Override
public IBinder onBind(Intent intent) {
return null; // Для Bound Service нужно вернуть реализацию IBinder
}
}
Важные современные альтернативы и ограничения:
IntentServiceустарел. Для фоновых задач используйтеWorkManager(гарантированное выполнение) илиJobScheduler(для API 21+).- Начиная с Android 8 (API 26), введены строгие ограничения на фоновые сервисы. Приложение в фоне должно использовать
startForegroundService()и показывать постоянное уведомление. - Сервис обязательно должен быть объявлен в
AndroidManifest.xml.
Ответ 18+ 🔞
Слушай, а вот эта ваша служба в Андроиде, это ж классика, блядь! Типа работяга, который в подвале пашет, пока ты в приложении кнопки тыкаешь. Но тут, сука, нюансы, как в хорошем детективе.
Вот смотри, их два основных вида, и они как два брата-близнеца, но один — отбитый максималист, а второй — хитрая жопа.
Первый, Started Service (Запущенный)
Этот чувак — одиночка. Ты его из активити крикнул: «Эй, startService()!», и он пошёл делать своё дело. А ты можешь хоть закрыться, он будет работать, пока не кончит. Или пока его явно не пристрелишь — stopSelf() или stopService(). Сам он не остановится, упёртый, блядь.
Второй, Bound Service (Связанный)
А этот — уже командный игрок. Он как сервер в баре. Клиенты (активити или другие компоненты) подходят, «привязываются» к нему через bindService(), и он им услуги оказывает. Работает, пока есть хоть один клиент. Как все отвалились — система его тут же в утиль отправляет. Экономичная, сука, схема.
Вот, смотри, как выглядит самый простой запущенный служак:
public class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Тут он какую-нибудь хуйню в фоне делает
return START_STICKY; // Это настройка, что делать, если система его вдруг прибьёт
}
@Override
public IBinder onBind(Intent intent) {
return null; // А тут он говорит: «На связывание, блядь, не рассчитывай!»
}
}
А теперь, внимание, ёпта, важное! Времена меняются, и старые подходы накрываются медным тазом.
IntentService— это дедушка, его уже списали. Не используй, а то пальцем у виска покрутят.- Вместо него теперь модно использовать
WorkManager(гарантирует, что работа сделается, даже если приложение выкинут) илиJobScheduler(для современных девайсов). - И главное, блядь, ограничение! Начиная с Android 8 (API 26) система стала злая, как собака. Если твоё приложение не на переднем плане, просто так сервис в фоне не запустишь. Придётся использовать
startForegroundService()и сразу вывешивать постоянное уведомление для пользователя, типа «Эй, я тут работаю, не трожь!». Иначе — пиздец.
И да, чувак, не забудь прописать этого работягу в AndroidManifest.xml. А то он как призрак — объявится из ниоткуда и начнёт пахать, система такого не любит. Всё, в рот меня чих-пых, вроде разжёвал.