Как сделать службу (service) не выключаемой?

Чтобы сделать службу (service) не выключаемой в Android, необходимо учитывать несколько факторов.

1. Foreground Service:
Лучший способ сделать службу не выключаемой - это использовать Foreground Service. Foreground Service - это служба, которая запускается с нотификацией, чтобы показать пользователю, что приложение все еще активно и работает. Для создания Foreground Service вам нужно:

- Создать сервис, расширяющий класс Service.
- Вызвать метод startForeground() в методе onStartCommand() вашего сервиса, передав в качестве аргументов уникальный идентификатор уведомления и объект Notification.
- Создать уведомление с помощью класса NotificationCompat.Builder, настроить его и передать его в качестве аргумента методу startForeground().

Пример кода для создания Foreground Service:

   public class MyService extends Service {
   
       private static final int NOTIFICATION_ID = 1;
   
       @Override
       public int onStartCommand(Intent intent, int flags, int startId) {
           ...
           startForeground(NOTIFICATION_ID, buildNotification());
           ...
           return START_STICKY;
       }
   
       private Notification buildNotification() {
           ...
           NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
              .setContentTitle("My Service")
              .setContentText("Running")
              .setSmallIcon(R.drawable.icon)
              .setPriority(NotificationCompat.PRIORITY_DEFAULT);
           ...
           return builder.build();
       }
   }

Помимо этого, необходимо добавить разрешение Foreground Service в файл манифеста AndroidManifest.xml.

   <service
       android:name=".MyService"
       android:foregroundServiceType="dataSync|location|mediaPlayback|phoneCall|rcon|sms|userInteraction" />

Важно отметить, что использование Foreground Service требует разрешения от пользователя на показ уведомлений, поэтому вам следует убедиться, что вы ясно объясните пользователю, зачем требуется служба и какие уведомления будут отображаться.

2. START_STICKY:
Иными словами, START_STICKY это флаг, который вы можете использовать при возвращении из метода onStartCommand() службы, чтобы указать, что служба должна быть перезапущена в случае, если она была выключена системой (например, из-за нехватки ресурсов).

   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
       ...
       return START_STICKY;
   }

Однако этот подход не гарантирует, что служба будет работать всегда, поэтому рекомендуется использовать Foreground Service вместе с START_STICKY для достижения наилучшего результата.

3. Запрос разрешения на выполнение в фоновом режиме:
С версии Android 10 (API уровень 29) службы, выполняющиеся в фоновом режиме, должны иметь разрешение SYSTEM_ALERT_WINDOW. Чтобы запросить это разрешение, вы должны добавить следующую строку в файл манифеста AndroidManifest.xml:

   <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Все последующие версии Android также могут включать дополнительные требования или ограничения для служб, работающих в фоновом режиме, что следует учитывать при разработке.

Итак, используя Foreground Service вместе с START_STICKY и запрашивая необходимые разрешения, вы можете сделать свою службу (service) в Android не выключаемой. Однако, помните, что сохранение службы работающей всегда может потреблять значительное количество системных ресурсов и заряда аккумулятора, поэтому рекомендуется тщательно оценить необходимость безостановочной работы службы и ее влияние на общую производительность устройства.