Фоновая служба приостановлена ​​/ убита - PullRequest
0 голосов
/ 17 февраля 2019

Я реализую приложение, которое слушает и выполняет действия, когда пользователь встряхивает телефон.

Поэтому я реализовал следующую службу:

public class ShakeMonitorService extends Service {

    ...
    ShakeDetector shakeDetector;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        shakeDetector= new ShakeDetector(this);
        shakeDetector.start();
        ....
        startForeground(MY_ID, myNotification);
        return Service.START_STICKY;
    }

    ...
}

и запустил службу в MainActivityonCreate

ContextCompat.startForegroundService(this, 
          new Intent(this, ShakeMonitorService.class));

В shakeDetector я прослушиваю события датчика для акселерометра, как описано здесь .

Он работает правильно на моих устройствах, но некоторые пользователи сообщают, что он работаетпока они не заблокируют свои устройства в течение длительного времени (то есть 3 часа).С этого момента приложение перестает обнаруживать жесты дрожания даже при использовании устройства (экран включен), пока приложение не запустится снова.

Что происходит?Я предположил, что Android убивает или приостанавливает приложение и останавливает службу до тех пор, пока она не будет снова открыта.

Как мне избежать этого?

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

1 Ответ

0 голосов
/ 18 февраля 2019

Я понял, что вы уже запустили сервис в качестве переднего плана с уведомлением, и это даст вашему сервису самый высокий приоритет.Вы можете легко проверить, работает ли служба по-прежнему или нет, проверив уведомление, потому что уведомление будет показано, как только служба будет запущена.но если уведомление все еще отображается, но вы заметили, что рейтинг выполнения службы ниже, чем вы ожидаете (приостановлен, а затем снова запустится как циклический перебор).тогда я думаю, что такое поведение вызвано тем, что Android является операционной системой, которой необходимо максимально экономить заряд батареи, поэтому выполнение службы будет отличаться, когда устройство подключено к зарядному устройству или устройство разблокировано и включено, или устройствозаперта.

, но если уведомление отклоняется, это означает, что служба уничтожена некоторыми ошибками в вашем коде, которые приводят к исключению в коде службы или утечке памяти, и если вы уже установили флаг службы на START_STICKYили START_REDELIVER_INTENT, система через некоторое время снова запускает службу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...