Держите Android-приложение в активном состоянии в любое время

У меня есть приложение для отслеживания, которое должно отправлять обновления местоположения на веб-сервер каждые 5 секунд. Это работает нормально, пока приложение бодрствует/видно.

Если устройство заблокировано, приложение переводится в спящий режим через 15 минут (плюс-минус секунда-другая).

Добавление приложения в «Неотслеживаемые приложения» в разделе «Монитор заряда батареи» также не останавливает его переход в спящий режим.

Я попытался создать wakelock, т.е.

pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TrackerTag");
wakeLock.acquire();

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

Я добавил приложение в список игнорирования для списка оптимизации батареи, так что это не значит, что оно убивает его, и вышеуказанный wakelock, похоже, ничего не делает.

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

Что мне нужно сделать, чтобы сказать андроиду «оставьте это приложение в покое, несмотря ни на что, и не останавливайте его, если я специально не закрою все и не убью его»?


person Some1Else    schedule 13.11.2017    source источник


Ответы (1)


Попробовав все возможные способы, которые я смог найти, чтобы остановить андроид, убивающий мое приложение, конечное «исправление» состоит в перезапуске основного действия каждые 3 минуты. Поскольку приложение никогда не запускается в течение 15 минут, это, кажется, не позволяет Android убить его.

Это исполняемый файл, который я использую. Поместите это в основное действие onCreate

h.postDelayed(new Runnable() {
    public void run() {
        runnable = this;
        recreate();
        h.postDelayed(runnable, 3*60*1000);
    }
}, 3*60*1000);

Это также перезапускает действие, когда оно приостановлено/скрыто. Если приложение видно, при повторном запуске активности происходит быстрое мерцание, но в моем случае это не проблема.

Если кто-то не может дать мне реальное официальное решение, все вышеперечисленное пока подойдет. Мое приложение работает и обновляет веб-сервер более часа, когда оно заблокировано. Perviosully это никогда не превысит 15 минут.

person Some1Else    schedule 14.11.2017
comment
Вы когда-нибудь улучшали это решение? - person Hugo; 12.08.2020