Что такое Service в Android и какие типы сервисов существуют?

Ответ

Service — компонент Android для выполнения длительных операций в фоне без пользовательского интерфейса.

Два основных типа:

  1. Started Service (Запущенный сервис)

    • Запускается вызовом startService() из Activity или другого компонента.
    • Работает независимо от запустившего его компонента.
    • Должен быть явно остановлен вызовом stopSelf() или stopService().
  2. 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. А то он как призрак — объявится из ниоткуда и начнёт пахать, система такого не любит. Всё, в рот меня чих-пых, вроде разжёвал.