Как исправить неработающий сервис с android:enabled="false"

Короткий ответ: если в манифесте у сервиса стоит android:enabled="false", система не будет автоматически запускать этот компонент; исправить можно включив компонент (PackageManager или adb) или запустив сервис программно после включения. Ниже — практические шаги, проверки и примеры кода.

Что значит android:enabled="false" для сервиса

Атрибут android:enabled="false" в AndroidManifest отключает компонент по умолчанию — система игнорирует попытки автозапуска через Intent, системные триггеры и START_STICKY. Компонент остаётся в пакете, его можно включить динамически и запустить вручную. Это удобно для модульных/enterprise-приложений, но мешает автозапуску.

Disabled сервис не отображается в системных списках "Фоновая работа" или "Оптимизация батареи", даже если включены разрешения.

Как включить сервис и запустить его (практические способы)

  1. Включение программно (рекомендуется для динамических сценариев)
  • Используйте PackageManager.setComponentEnabledSetting — не требуется root.

Пример (Kotlin):

val comp = ComponentName(this, YourService::class.java)
packageManager.setComponentEnabledSetting(
    comp,
    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
    PackageManager.DONT_KILL_APP
)
startForegroundService(Intent(this, YourService::class.java))

После setComponentEnabledSetting компонент можно стартовать как обычно. Не забудьте stopService() по необходимости.

  1. Включение через ADB (для тестирования)
  • Быстро, требует подключенного устройства/эмулятора:
adb shell pm enable com.yourpackage/.YourService
# проверить
adb shell dumpsys package com.yourpackage | grep YourService
  1. Включение вручную в настройках пользователя
  • Настройки → Приложения → Ваше приложение → Автозапуск/Фоновая работа/Оптимизация батареи. На кастомных прошивках (MIUI, One UI) дополнительно разрешите "Автозапуск" и "Запуск в фоновом режиме".
  1. Если нужен постоянный автозапуск — измените манифест
  • Поставьте android:enabled="true" и корректно укажите foregroundServiceType для современных API.

Пример манифеста:

<service
    android:name=".MyService"
    android:enabled="false"
    android:exported="false"
    android:foregroundServiceType="mediaPlayback" />

Пример сервиса (с обязательным startForeground для API >= 26):

class MyService : Service() {
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        createNotificationChannel()
        val n = NotificationCompat.Builder(this, CHANNEL_ID)
            .setContentTitle("Сервис работает")
            .build()
        startForeground(1, n)
        // логика
        return START_STICKY
    }
    override fun onBind(i: Intent?) = null
}

Для Android 14+ указывайте корректный foregroundServiceType (dataSync, mediaPlayback и т.д.), иначе получите SecurityException.

Диагностика: что проверить если сервис не стартует

  • Манифест: убедитесь, что android:enabled не равен "false" (или включите компонент программно).
  • Логи: adb logcat | grep YourService — ищите ошибки "Component not enabled" или IllegalStateException.
  • Разрешения: нужен ли BIND_JOB_SERVICE, или вы используете startForegroundService для foreground-сервиса.
  • Политики батареи: Doze, App Standby, OEM-ограничения (MIUI/Huawei/Samsung) могут останавливать или блокировать автозапуск.
  • Версия OS: с API 26+ требуются foreground-сервисы для продолжительной работы; с новых API — дополнительные требования к типу сервиса.
  • Эмулятор: некоторые поведения отличаются — для тестов включите "Wi‑Fi is always available" в AVD.

Частые ошибки

  • Неправильный Intent/имя компонента — startService не находит компонент.
  • Попытка вызывать startService в фоне без startForegroundService на API >= 26 → IllegalStateException.
  • Оставили android:enabled="false" после сборки — сервис не стартует, хотя код запуска выполняется.
  • На MIUI/Huawei сервисы блокируются настройками производителя — пользователю нужно разрешить автозапуск.
  • Забытая foreground-нотификация → система убьёт сервис.

FAQ

  • Можно ли запустить disabled-сервис без включения компонента?
    Нет — система игнорирует автозапуск; только после включения компонента возможен нормальный запуск.

  • Работает ли setComponentEnabledSetting без перезапуска приложения?
    Да, можно применить PackageManager.DONT_KILL_APP, сервис станет доступен сразу.

  • Поможет ли WorkManager вместо сервиса?
    Для отложенных/повторяющихся задач WorkManager более устойчив к ограничениям батареи и рекомендациям платформы.

  • Нужен ли root для включения компонента?
    Нет — PackageManager API и adb enable работают без root (adb требует отладки).

Если сервис критичен, сочетайте включение компонента + foreground-сервис + обработку политик батареи (информирование пользователя о разрешениях) — это даст наилучшую надёжность на большинстве устройств.