Git Product home page Git Product logo

psa98 / dont_kill_my_app Goto Github PK

View Code? Open in Web Editor NEW
37.0 1.0 4.0 2.81 MB

Библиотека классов и тестовое приложение к ней. Задача: Создание кода, способного периодически делать что-то пока приложение находится в фоне, с заданной частотой, по возможности игнорируя doze mode и другие оптимизации экономии питания Android систем с автоматическим перезапуском приложения при его закрытии системой или перезагрузкой устройства. Протестировано на Samsung SDK level 30- обеспечивается "незасыпание" фоновых процессов в среднем более чем на 3 минуты при обычной работе, и эпизодические перерывы не более 5-10-20 минут в Doze mode.

License: MIT License

Java 100.00%
android android-development library reboot background

dont_kill_my_app's Introduction

Dont_Kill_My_App

Библиотека классов и тестовое приложение к ней. Задача:
Создание кода, способного поддерживать активность (препятствовать остановке его операционной системой) пок приложение находится в фоне, по возможости игнорируя doze mode и другие оптимизации экономии питания Android систем с автоматическим перезапуском приложения при его закрытии системой или перезагрузкой устройства.

Собственно идея написать эту библиотеку возникла по итогам моего участия в чате https://t.me/android_ru где жалобы на то что "система убивает мое крутое приложение и не дает мне в фоне слать с телефона какую-то телеметрию круглые сутки" попадались несколько раз в день. Для решения пришлось использовать приемы ТРИЗ и подумать с полчасика - после чего оно стало вполне очевидным.

Для активации режима "выживания приложения" достаточно добавить в onCreate() Application класса следующий код: LifeKeeperAPI lifeKeeper = LifeKeeperAPI.getInstance();

lifeKeeper.start(this);

Дополнительно можно, к примеру, инициировать для последующего обзора через observeForever лайфдаты полученные методом lifeKeeper.subscribeOnPeriodicEvents(), или установить слушатели на вырабатываемые регулярные события.

Протестировано на Samsung SDK level 30 - обеспечивается "незасыпание" фоновых процессов в среднем более чем на 3 минуты при обычной работе, и эпизодические перерывы не более 5-10-20 минут в Doze mode.

Поддерживается уровень SDK 19-31. Работа на аппаратах с агрессивной оптимизацией питания китайских производителей не тестировалась и может быть проблемной

Как это работает:

  1. Приложение, которое не находится на переднем плане, но активно выполняет какую-то работу в фоне, находится в приорететном положении с точки зрения его выгрузки системой и выделения процессорного времени
  2. Приложение остановленное или убитое, но имеющее активные бродкаст ресиверы и воркеры перезапускается и при их сработке (получении события). Таким образом, следует подписаться на возможно большее количество вызываемых перодически системных бродкастов и создать несколько регулярных воркеров с разной периодичностью.
  3. Timer из класса java.util для остановленного приложения никак не гарантирует сработки TimerTask в заданное время и вообще. Однако можно ожидать достаточной периодичности в вызове бродкастов и сработке воркеров WorkerManager-a, данные периодические события можно использовать для вызова периодических фоновых операций в основном приложении с негарантированнойно достаточной частотой
  4. В "агрессивном" режиме используется то обстоятельство что система обычно не будет останавливать приложение играющее звук в фоне, для того что бы не прерывать проигрывание музыки. Для экономии энергии проигрывается "звук тишины" - пренебрежимо малый сигнал записанный в формате wav, не требующем ресурсов процессора для дешифровки, через один канал и на минимально возможной громкости.

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

dont_kill_my_app's People

Contributors

psa98 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

dont_kill_my_app's Issues

Типичный лог событий

:

22:38:51 Battery event
22:39:01 Battery event
22:39:01 Periodic event #1 60 s
22:39:02 Periodic event #2 90 s
22:39:11 Battery event
22:39:21 Battery event
22:39:31 Battery event
22:39:32 On Tick Event
22:39:34, worker event Worker event 55 s
22:39:41 Battery event
22:39:51 Battery event
22:39:54, worker event Worker event 240 s
22:40:02 Battery event
22:40:02 Periodic event #1 60 s
22:40:04 On Tick Event
22:40:12 Battery event
22:40:22 Battery event
22:40:29, worker event Worker event 55 s
22:40:32 Battery event
22:40:32 Periodic event #2 90 s
22:40:42 Battery event
22:40:52 Battery event
22:41:02 Battery event
22:41:02 Periodic event #1 60 s
22:41:08 On Tick Event
22:41:12 Battery event
22:41:22 Battery event
22:41:24, worker event Worker event 55 s
22:41:32 Battery event
22:41:42 Battery event
22:41:49 Battery event
22:41:51 On Tick Event .
22:41:59 Service relaunched
22:42:00 Battery event
22:42:00 Periodic event #1 60 s
22:42:00 Periodic event #2 90 s
22:42:00 On Tick Event
22:42:15 Timer task
22:42:19 Battery event
22:42:34 Timer task
22:42:49 Timer task
22:42:55, worker event Worker event 55 s
22:43:00 On Tick

Типичный лог периодов "сна" когда приложение таки удалось усыпить или тормознуть на время больше 3 минут

Power mode doze off No timer events registered between 08/08 03:15:55 and 08/08 03:19:57 for 242s
No timer events registered between 08/08 03:24:18 and 08/08 03:46:11 for 1313s
No timer events registered between 08/08 03:55:56 and 08/08 04:06:12 for 616s
No timer events registered between 08/08 04:06:13 and 08/08 05:00:43 for 3270s

Power mode doze on No timer events registered between 08/08 05:10:08 and 08/08 05:16:15 for 367s
No timer events registered between 08/08 05:16:15 and 08/08 05:20:55 for 280s
No timer events registered between 08/08 05:24:50 and 08/08 05:30:56 for 366s
No timer events registered between 08/08 05:31:17 and 08/08 05:35:58 for 281s
No timer events registered between 08/08 05:35:58 and 08/08 05:41:01 for 303s
No timer events registered between 08/08 05:41:01 and 08/08 05:46:46 for 345s
No timer events registered between 08/08 05:55:44 and 08/08 06:01:01 for 317s
No timer events registered between 08/08 06:06:35 and 08/08 06:10:55 for 260s
No timer events registered between 08/08 06:14:37 and 08/08 06:18:44 for 247s
No timer events registered between 08/08 06:18:44 and 08/08 06:24:55 for 371s
No timer events registered between 08/08 06:32:31 and 08/08 06:38:19 for 348s
No timer events registered between 08/08 06:38:19 and 08/08 06:43:09 for 290s
No timer events registered between 08/08 06:43:32 and 08/08 06:47:49 for 257s

Power mode doze off
Power mode doze on No timer events registered between 08/08 06:52:35 and 08/08 07:00:03 for 448s
No timer events registered between 08/08 07:01:29 and 08/08 07:14:56 for 807s

Power mode doze off No timer events registered between 08/08 07:50:54 and 08/08 07:55:01 for 247s
No timer events registered between 08/08 08:25:03 and 08/08 08:29:21 for 258s
No timer events registered between 08/08 08:45:55 and 08/08 08:50:00 for 245s
No timer events registered between 08/08 09:00:55 and 08/08 09:05:56 for 301s
No timer events registered between 08/08 09:05:56 and 08/08 09:10:55 for 299s
No timer events registered between 08/08 09:51:00 and 08/08 10:11:00 for 1200s
No timer events registered between 08/08 10:20:56 and 08/08 10:25:09 for 253s

Power mode doze on No timer events registered between 08/08 11:11:57 and 08/08 11:16:10 for 253s
No timer events registered between 08/08 11:16:10 and 08/08 11:21:45 for 335s

Power mode doze off No timer events registered between 08/08 13:40:55 and 08/08 13:45:53 for 298s

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.