Как исправить неработающий сервис с android:enabled="false"
Короткий ответ: если в манифесте у сервиса стоит android:enabled="false", система не будет автоматически запускать этот компонент; исправить можно включив компонент (PackageManager или adb) или запустив сервис программно после включения. Ниже — практические шаги, проверки и примеры кода.
Что значит android:enabled="false" для сервиса
Атрибут android:enabled="false" в AndroidManifest отключает компонент по умолчанию — система игнорирует попытки автозапуска через Intent, системные триггеры и START_STICKY. Компонент остаётся в пакете, его можно включить динамически и запустить вручную. Это удобно для модульных/enterprise-приложений, но мешает автозапуску.
Disabled сервис не отображается в системных списках "Фоновая работа" или "Оптимизация батареи", даже если включены разрешения.
Как включить сервис и запустить его (практические способы)
- Включение программно (рекомендуется для динамических сценариев)
- Используйте 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() по необходимости.
- Включение через ADB (для тестирования)
- Быстро, требует подключенного устройства/эмулятора:
adb shell pm enable com.yourpackage/.YourService
# проверить
adb shell dumpsys package com.yourpackage | grep YourService
- Включение вручную в настройках пользователя
- Настройки → Приложения → Ваше приложение → Автозапуск/Фоновая работа/Оптимизация батареи. На кастомных прошивках (MIUI, One UI) дополнительно разрешите "Автозапуск" и "Запуск в фоновом режиме".
- Если нужен постоянный автозапуск — измените манифест
- Поставьте 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-сервис + обработку политик батареи (информирование пользователя о разрешениях) — это даст наилучшую надёжность на большинстве устройств.