Постоянно ли запущен поток Android из службы переднего плана? - PullRequest
2 голосов
/ 08 мая 2019

Мне нужен сервис, который должен работать 24/7 и выполнять следующие функции.

(1) каждую секунду проверять GPS пользователя с помощью fusedLocationApi, чтобы проверить, входит ли пользователь в определенную геозону.

(2) проверка, установлен ли другой пакет приложения (Поток)

(3) отправка действующего пакета на сервер с определенным интервалом в 60 секунд.(Поток)

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

Все вышеперечисленные потоки выполняются в onStartCommand службы переднего плана.Я читал, что сама служба переднего плана не умрет в большинстве случаев, но как обстоят дела с потоками?Постоянно ли запущены потоки из службы переднего плана?И кроме того, как я могу проверить, чтобы доказать, что он постоянен?

Пожалуйста, помогите!

1 Ответ

1 голос
/ 10 июня 2019

Я отвечу на свой вопрос.

Около месяца наблюдений и попыток я наконец получил то, что хочу.

Ответ на вопрос - ДА, но НЕТ. Потоки живы в режиме ожидания, но то, что они делают внутри, приостановлено.

Моя служба переднего плана имеет FusedLocationProviderClient, который выполняется с интервалом в минуту, и потоки, выполняющие некоторые другие операции, такие как проверка связи с моим сервером с интервалом в шесть минут. Они оба не умрут, но произошла огромная задержка при пинге. Предполагается, что он проверяет связь с сервером каждые шесть минут, но, находясь в режиме ожидания, он отправляет эхо-запрос с задержкой 30 минут или более, даже после часа.

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

(1) Добавлен белый список батарей при запуске.

        Intent intent = PowerSaverHelper.prepareIntentForWhiteListingOfBatteryOptimization(getContext(), getPackageName(), false);

        if (intent != null) {

            startActivityForResult(intent, 19810);

        } else {

            getInterval();
        }

(2) Создание и удержание частичного wakeLock для onStartCommand службы Foreground.

        try {

            PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
            wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                    "MyService::GpsWakeLock");
            if (!wakeLock.isHeld()) {
                wakeLock.acquire();
            }

        } catch (Exception e) {
            ErrorController.showError(e);
        }

И выпустить его в onDestroy службы переднего плана.

            if (wakeLock != null && wakeLock.isHeld()) {

                wakeLock.release();
            }

Это решение отлично сработало для меня. Gps извлекает местоположение GPS за минуту (если может) и проверяет сервер с точным интервалом в течение ночи, когда устройство не подключено ни к какому источнику питания.

Но падение этого метода вполне ожидаемо. Разряд батареи. Просматривая это через Battery Historian, я увидел, что процессор всегда активен, пока работает служба переднего плана. Даже удаляя gps (который разряжает батарею), он потратил около 0,7% батареи за час тестирования.

Однако, если ваша цель похожа на мою, специальное приложение, которое должно быть постоянным, этот подход может помочь.

...