Есть ли способ запустить сервис постоянно в Android?

На StackOverFlow есть несколько подобных вопросов, но ни одно из решений не работает для меня

проблема

Проблема заключается только в нескольких устройствах, таких как OnePlus и MI. Служба убивается, как только пользователь удаляет приложение из недавнего приложения.

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

Что я хочу

Мне нужно запустить службу, которая будет постоянно указывать местоположение (24/7) в фоновом режиме (это приложение предназначено только для конкретных людей, поэтому не стоит беспокоиться о времени автономной работы) .

То, что я пробовал до сих пор:

1) Пытался запустить сервис переднего плана.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        startForegroundService(intent)
     } else {
            startService(intent)
     }

также в сервисе запущен метод onCreate с уведомлением

@Override
public void onCreate() {
    Log.i("Service", "onCreate");
    startForeground(NOTIFICATION_ID, getnotification());
 }

2) Пытался вернуться START_STICKY в onStartCommand

 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {

    initLocationClient();
    initLocationSyncThread();

    return START_STICKY;
}

3) Пытался повторно начать службу в onDestroy а также onTaskRemoved но им не звонят.

4) Пытался привязать сервис

5) Я могу планировать диспетчер тревог и часто запускать сервис, но магазин воспроизведения предупредит, что наше приложение слишком часто использует диспетчер тревог и это плохая практика. И теперь есть способ с помощью workmanager планировать менее 15 минут, а запуск через 15 минут все еще не гарантирован.

Так есть ли способ продолжить работу службы, кроме указанных выше параметров?

2 ответа

Если вы перейдете по ссылке, вы найдете:

К сожалению, некоторые устройства осуществляют принудительное отключение приложения из меню "последние". Сток Android не делает этого. Когда приложение принудительно останавливается, оно не может выполнять задания, получать сигналы тревоги или широковещательные сообщения и т. Д. Поэтому, к сожалению, мы не можем решить эту проблему - проблема заключается в ОС, а обходного пути нет.

Это известная проблема. Чтобы сэкономить заряд батареи, многие производители принудительно закрывают приложение, отменяя, таким образом, все задачи периода, аварийные сигналы, радиовещательные приемники и т. Д. Основными производителями являются OnePlus(у вас есть возможность переключения),Redmi,Vivo,Oppo,Huwaei.

Каждое из этих устройств имеет менеджеры оптимизации типа AutoStartManager /AutoLaunch/StartManager. Которые мешают фоновым действиям начинать заново. Вам нужно будет вручную попросить пользователя внести в белый список ваше приложение, чтобы приложение могло автоматически запускать свои фоновые процессы. Перейдите по этой и этой ссылке, для получения дополнительной информации.

Методы, которые нужно добавить в белый список для разных производителей, приведены в этом ответе stackru.Даже после добавления в белый список ваше приложение может не работать из-за режима DOZE, для этого вам придется игнорировать оптимизацию батареи

Также, если вам интересно, такие приложения, как Gmail/Hangout/WhatsApp/Slack/LinkedIn и т. Д., Уже занесены в белый список этими менеджерами автозапуска. Следовательно, нет никакого влияния на их фоновые процессы. Вы всегда получаете своевременные обновления и уведомления.

Вот несколько вещей, которые мало помогли.

В AndroidManifest.xml добавьте строку android:enabled="true"

<service
      android:name=".service.TrackingService"
      android:exported="false"
      android:enabled="true"
    />

Внутренняя служба Добавьте сигнал тревоги, чтобы снова проснуться через 2 секунды.

@Override
public void onTaskRemoved(Intent rootIntent) {
    initAlarm();
    super.onTaskRemoved(rootIntent);
}

   private void initAlarm() {
    AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, StartServiceReceiver.class);
    PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

    alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
            SystemClock.elapsedRealtime() +
                    2000, alarmIntent);

}

Создать получателя StartServiceReceiver и в этом просто запустите сервис снова.

Для устройств Mi нам нужно разрешить разрешение внутри настройки, чтобы служба могла запускаться в фоновом режиме.

Правильный способ прослушивания местоположения на фоне использования API слитого местоположения из сервисов воспроизведения.

Посмотрите на образцы здесь. https://github.com/googlesamples/android-play-location?files=1

Эти API являются энергоэффективными, и я бы порекомендовал это тоже.

Другие вопросы по тегам