Есть ли способ запустить сервис постоянно в Android? - PullRequest
0 голосов
/ 28 января 2019

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

Проблема

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

Я читал, что эти 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 минут.

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

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Если вы пройдете через ССЫЛКА , вы найдете:

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

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

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

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

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

0 голосов
/ 10 апреля 2019

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

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

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

0 голосов
/ 31 января 2019

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

В 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 нам нужно разрешить внутреннюю настройку, позволяющую запускать службу в фоновом режиме

...