Подтвердить что ты не робот

Android 7.0 (нуга) Режим Doze останавливает веб-службу

У меня есть служба Android foreground с блокировкой WiFi, которая действует как веб-сервис для другого локального устройства. До режима "Доза" получение Wi-Fi-блокировки и обслуживание по мере необходимости отлично работало.

Даже когда оптимизация батареи отключена для моего приложения, телефон по-прежнему убивает приложение, когда экран выключен на несколько минут.

Как правильно предупредить Android о том, что служба, запрошенная клиентом, явно выполняется на переднем плане, и они не хотят, чтобы их телефон спал в это время?

EDIT: эта проблема все еще существует в Android 8.0 (Oreo)

4b9b3361

Ответ 1

вы можете сделать так: так же, как вы звоните в свою службу, вы можете добавить код, чтобы не пропускать экран. Это позволит избежать автоматической блокировки телефона. Ниже приведен фрагмент кода из документов.

    public class MainActivity extends Activity {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //keep screen awake
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
      }

Преимущество такого подхода заключается в том, что в отличие от блокировок слежения, он не требует специального разрешения, и платформа правильно управляет пользователем, перемещающимся между приложениями, без вашего приложения, которое должно беспокоиться о выпуске неиспользуемых ресурсов. Кроме того, вы можете эффективно использовать диспетчер аварийных сигналов, как описано в этом SO answer:

Ответ 2

Попробуйте использовать службу переднего плана https://developer.android.com/guide/components/services.html#Foreground

Служба переднего плана - это услуга, которую пользователь активно осознает и не является кандидатом на то, чтобы система убивала, когда она была низкой в ​​памяти. служба переднего плана должна предоставлять уведомление для строки состояния, который находится под заголовком "Текущий". Это означает, что уведомление не может быть отклонено, если служба не остановлена или удалены с переднего плана.

Вы также можете попробовать FULL_WAKE_LOCK или SCREEN_DIM_WAKE_LOCK и посмотреть, не мешает ли он перейти в режим doze.refer - https://developer.android.com/reference/android/os/PowerManager.html#FULL_WAKE_LOCK