Android app working in background

How to stop Android apps running in the background

Having your battery drain faster than expected is one of the biggest headaches with any Android phone. Tracking down a charger and plugging in shortly after a full charge overnight is always a sad feeling. If you’re ready to thwart your battery woes, a simple culprit may be to blame. Here’s what you need to know to conquer background apps.

These apps can sap your battery and precious resources, but there may be a few different causes for your problems. Some apps might not be well optimized, some might be malware, or some might have a bug. All you need now is a little know-how, and we’ll have you living the charged life shortly.

Ready for a little extra juice at no cost? Let’s get into the best battery improvements.

Update your device! Get to Android 10 or better if you can

Many phones are still running on Android 10 even though Android 11 has been out for a while. Luckily, that’s good news for users. Android 10 has great power management features that place limits on background apps and therefore extend your phone’s battery life. One of them is called Adaptive Battery, which uses machine learning to figure out which apps you’ll use in the next few hours and which ones you won’t use until later, if at all today. Based on your usage patterns, it places each app into one of the five App Standby Buckets: Active, Working set, Frequent, Rare, and Never. Each of these buckets has its limitations for how much resources the apps it contains can use.

To put it simply, an app placed in the Never bucket is hardly ever used, which is why the system will limit its access to resources like the CPU. This means it will use less battery. On the other hand, apps in buckets like Active are the ones you use the most and will get full access to the system’s resources, so you can expect to get all your notifications on time.

The process is automatic and dynamic, which means the system learns your usage pattern over time and moves the apps from one bucket to the other accordingly.

Check what’s draining your phone

Battery

Since battery life is so important, it’s well monitored by your Android OS. To look at the apps guzzling power, go to Settings > Battery > Battery Usage. You’ll get a list accurate to two decimal points of what’s draining your battery. Depending on your device and software, the apps will be split into either system or non-system apps or by hardware and software to make things even easier.

The more you use certain apps, the higher on the list they’ll sit. Look out for any apps you don’t recognize using more than a tiny percentage of your battery. Any app using over a few percent is worth looking into — saving five percent here or four percent there will add up. Anything that’s a Google app or service is probably not something to worry about and just a natural part of Android and Google Mobile Services.

Using Developer options, you can also check out which apps dominate your phone’s limited memory, also known as RAM. It may be that an app is not using a lot of battery, but when you’re only working with 2GB of RAM and an app you’re not using is taking up a few hundred MB, leaving you short on available memory.

Читайте также:  Uses permission android name android permission camera

You can check this out in a few different ways, but here’s the sure-fire winner that works in new Android versions:

  • Go to Settings >System > About phone.
  • Scroll down and find “Build number” and then tap it seven times. This will enable “Developer options” on your device, and you’ll see a notification that this has happened.

Now go back to Settings > System, and you’ll be able to select “Developer options” from there.

Then go Settings > Developer Options > Processes (or Settings > System > Developer Options > Running services.)

Here you can view which processes are running, your used and available RAM, and which apps are using it up. Again, some of these services are essential to keep your phone running. You should be primarily looking for demanding apps you’ve downloaded personally.

If this method doesn’t work to unlock developer options, a quick Google search of your phone model and “developer options unlock” should help.

Stop the app, kill it, or uninstall your background apps

Once you’ve found your culprit, you have to know what to do next. Luckily, you have a few options to choose from if you don’t want to remove the app entirely.

Find the app in Developer Options and stop it

The first involves the Developer Options > Running services method we described above.

Find the background app, Force Stop or Uninstall

Once you’ve identified your background apps, it might be worth checking out all the apps you have installed and giving them a once over.

Go to Settings > Apps & Notifications > Apps.

You’ll see your apps load in alphabetical order, and from here, you can click into any app and decide to Force Stop or Uninstall it. As with before, Force Stop might cause a crash, but you’ll be OK following a reboot.

Limit problematic background apps

If you want to keep using an app that appears to have high demand, you might be able to limit what it can do.

Some Samsung and Huawei phones include OS options to manage background apps. In Battery Settings, Huawei offers an “App launch” option, which allows you to identify specific apps, restrict launches, and target power-saving measures. Samsung also offers a power-saving option to help manage apps.

If you don’t have access to a proprietary built-in option, there are, of course, good apps to help. The perennial favorite is Greenify, which offers fine controls over apps and places them in hibernation. If you have a rooted phone, you’ll have even more control, but it works well with standard devices too.

One problem with apps like this is intentionally introducing another app to monitor your device. In our popular post titled 13 tricks and hacks to speed up Android, our own Adam Sinicki noted that while background apps can kill the battery, background app killers can slow you down as well:

What next?

Android 11 is landing for most people, and we expect Google to continue upgrading Android’s ability to quash any apps that make your life harder. We’ll probably hear more as the update hits even more devices, and Android 12, which is currently in beta, should offer improvements in the future as well.

Источник

Фоновая работа в Android: обзор возможностей WorkManager

В мобильных приложениях широко востребованы различные виды фоновой работы. Зачастую нужно поддерживать работу в офлайне, планировать какие-либо долгие и повторяющиеся задачи на определенное время, выполнять «тяжелые» задачи без привязки к сценариям пользовательского взаимодействия.

Например, в ритейле мерчендайзерам бывает необходимо в конце каждого рабочего дня отправлять фотоотчеты на сервер и удалять их из памяти телефона, чтобы не занимать место. А для работы онлайн-кассы требуется в фоновом режиме загружать актуальный справочник товаров. В этой статье мы рассмотрим один из самых популярных инструментов для реализации фоновой работы – WorkManager из Android Jetpack.

Для фоновой работы в Android существует множество изначально реализованных нативных решений, таких как AlarmManager, Handler, IntentService, SyncAdapter, Loader. Однако, их судьба складывается по-разному:

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

Читайте также:  H265 кодек для андроид

На действия AlarmManager система Android накладывает все больше ограничений, также он имеет довольно раздутое API для работы.

IntentService, используемый для обработки операций в рабочем потоке, начиная с Android API 30 стал deprecated.

Loader имеет привязку к жизненному циклу Activity/Fragment и, с появлением более новых, удобных инструментов, позволяющих решать схожие задачи, морально устарел.

SyncAdapter также морально устарел, не имеет возможности задавать условия запуска задач, создавать цепочки задач.

Начиная с Android 5.0 появился JobScheduler, позволяющий задавать условия запуска задач (устройство на зарядке, подключено к wi-fi и т.д.). Его работа основана на Service, и, чтобы обработка прошла асинхронно, необходимо самостоятельно запустить рабочий поток, а также вызвать необходимые методы JobService для избежания утечек. Все описанное повышает вероятность ошибок и доступно только с api 21.

Учитывая перечисленные ограничения, разработчики столкнулись с потребностью в таком инструменте, который может инкапсулировать работу по избежанию утечек и обращению с потоками, а также предоставить удобное API для запуска асинхронных, повторяющихся, откладываемых задач. В результате в 2018 году был выпущен Android Jetpack, частью которого стал WorkManager (познакомиться с ним подробнее можно, в частности, здесь).

Далее рассмотрим подробнее особенности работы.

WorkManager предоставляет удобные инструменты для описанных выше задач, совместим с корутинами, RxJava2, другими Jetpack библиотеками, может работать в мультипроцессном режиме. Доступен он начиная с API 14 за счет использования под капотом уже знакомых инструментов.

1) Описание и добавление задачи

Для описания задачи необходимо унаследоваться от класса Worker и определить метод doWork():

Код внутри метода doWork() будет выполнен в рабочем потоке WorkManager’a.

Далее задачу можно сделать разовой с помощью OneTimeWorkRequestBuilder.

Либо ее можно сделать периодической с помощью PeriodicWorkRequestBuilder.

В обоих случаях мы передали в качестве generic-параметра класс Worker’a, определенный нами.

В случае периодической задачи мы дополнительно определили интервал ее выполнения — 30 минут (минимально доступный интервал составляет 15 минут; если мы поставим интервал меньше 15 минут, то WorkManager повысит его до 15). А также параметр flex — 25 минут. Этот параметр ограничивает окно запуска задачи: она будет запущена не в любой момент интервала, а между 25 и 30 минутами.

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

После создания задачи мы добавляем ее в очередь WorkManager’a.

2) Критерии запуска задачи

Мы можем задать необходимые условия для запуска задачи:

После этого констрейнты добавляются в билдере work request’a.

Рассмотрим перечисленные условия запуска:

setRequiresCharging (boolean requiresCharging) — критерий: зарядное устройство должно быть подключено.

setRequiresBatteryNotLow (boolean requiresBatteryNotLow) — критерий: уровень батареи не ниже критического (задача начинает выполняться при уровне заряда больше 20, а останавливается при значении меньше 16).

setRequiredNetworkType (NetworkType networkType) — критерий: наличие интернета. Мы можем указать, какой именно тип сети интернет (NetworkType) должен быть при запуске задачи. Тип соединения с сетью может быть:

CONNECTED — WiFi или Mobile Data

UNMETERD — только WiFi

METERED — только Mobile Data

NOT_ROAMING — интернет не должен быть роуминговым;

NOT_REQUIRED — интернет не нужен.

setRequiresDeviceIdle (boolean requiresDeviceIdle) — критерий: девайс не используется какое-то время и ушел “в спячку”. Работает на API 23 и выше.

setRequiresStorageNotLow (boolean requiresStorageNotLow) — критерий: на девайсе должно быть свободное место, не меньше критического порога.

3) Цепочки задач

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

Периодические задачи ставить в цепочку нельзя.

В данном примере мы параллельно запускаем задачи myWorkRequest1, myWorkRequest2. После их выполнения будут параллельно выполняться задачи myWorkRequest3, myWorkRequest4. Затем — задача myWorkRequest5. Данный пример можно переписать, выделив параллельные запросы в цепочки. После чего две получившиеся цепочки можно передать в метод combine() класса WorkContinuation для параллельного исполнения:

4) Уникальная цепочка задач

Мы можем сделать последовательность задач уникальной. Для этого нужно начать последовательность методом beginUniqueWork():

В этот метод мы передали название уникальной цепочки, стратегию действий при коллизии цепочек с одинаковым именем и саму задачу (можно передать список задач).

Стратегий может быть несколько:

Читайте также:  Перенести кэш память андроид

REPLACE – остановка последовательности с таким же именем, и запуск новой;

KEEP – оставит в работе текущую выполняемую последовательность, а новая будет проигнорирована;

APPEND – запустит новую последовательность после выполнения текущей.

5) Отмена задачи

Для отмены задачи у класса WorkManager есть следующие методы:

cancelAllWork() — отменяет все запланированные задачи (и не только вашим приложением);

cancelAllWorkByTag(String tag) — отменяет все задачи с указанным тегом;

cancelUniqueWork(String uniqueWorkName) — отменяет уникальную цепочку задач с указанным именем;

cancelWorkById(UUID id) — отменяет задачу по указанному id.

6) Статусы задач

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

ENQUEUED – задача запланирована;

RUNNING – задача выполняется;

SUCCEEDED (SUCCESS) – задача выполнена, терминальное состояние;

FAILED (FAILURE) – задача не была выполнена, не повторять, терминальное состояние;

RETRY – задача не была выполнена, повторить через некоторое время;

BLOCKED – задача включена в цепочку, и ее очередь выполнения еще не наступила;

CANCELLED – задача отменена, терминальное состояние.

Для разовой задачи возможен следующий флоу:

Если одна из разовых задач включена в цепочку и завершилась с состоянием FAILED, следующие за ней по цепочке задачи будут отменены.

Для периодической задачи существует другой флоу:

Как мы видим, для периодической задачи существует одно терминальное состояние: CANCELLED.

Так как WorkManager является частью Jetpack, получить информацию о задаче можно в виде LiveData:

7) Входные и выходные данные задачи

Мы можем задать входные данные, необходимые для ее работы.

Когда задача будет запущена, мы сможем получить эти данные внутри нее с помощью:

После выполнения мы можем в Result.success() или Result.failure() передать выходные данные задачи.

8) Передача данных между задачами

При создании цепочки задач выходные данные одной задачи будут передаваться во входные данные другой. Рассмотрим такой пример. Пусть задачи myWorkRequest1 и myWorkRequest2 выполняются параллельно, затем выполняется myWorkRequest3. В результате выходные данные из первой и второй задач попадут в третью.

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

9) InputMerger

Для преобразования нескольких выходных результатов в один входной используются реализации класса InputMerger. По умолчанию используется OverwritingInputMerger, перезаписывающий значение по уже существующему ключу. Это было видно на предыдущем примере с двумя параллельными задачами. Если же нам нужно при совпадении ключа записать все пришедшие значения, следует использовать ArrayCreatingInputMerger.

InputMerger можно задать при создании задачи. Добавим ArrayCreatingInputMerger для myWorkRequest3 из предыдущего примера.

Теперь по ключу keyA мы получим не последнее записанное значение, а массив [«value1», «value2»]. Также и для ключа keyB — [1, 2].

10) Кастомная конфигурация WorkManager

WorkManager имеет собственный провайдер, WorkManagerInitializer, который мержится в манифест приложения. Он создает пул потоков, необходимый для работы, фабрики для создания InputMerger’ов и WorkerFactory (создает объекты Worker’ов, полезна в случаях, когда класс Worker’a получил новое имя, и WorkManager должен соотнести действия, запланированные на старое имя, с новым). При необходимости эти параметры можно изменить.

Для начала нужно отключить стандартный провайдер WorkManager’a. Это делается в манифесте приложения путем объявления.

После этого нужно сделать класс нашего приложения реализацией интерфейса Configuration.Provider. И в переопределенном методе изменить нужные нам параметры. Например, заменим стандартный Executor, в потоках которых выполняется код Worker’ов, и изменим минимальный уровень логирования:

11) Тестирование

Для тестирования Worker’ов нужно подключить в проект зависимость

В этом пакете есть классы, которые помогают в тестовой среде.

Пусть у нас есть Worker, который складывает 2 числа и выдает результат в качестве выходных данных. Протестируем его:

Дополнительно можно проверить, что код Worker’a выполняется только тогда, когда выполнены все условия его запуска. А также проверить статус работы.

Пусть у нас есть тот же Worker, выполняющий сложение 2 чисел. Зададим ему условия старта и протестируем.

Заключение

WorkManager предоставляет широкие возможности для асинхронной работы, которая должна выполняться в определенном состоянии устройства, откладывать ее, планировать, выполнять параллельно, перезапускать, запускать периодически, работать в многопроцессном режиме. Также этот инструмент гарантирует выполнение задачи даже после закрытия приложения и перезагрузки устройства. А его доступность, начиная с API 14, делает его must-have инструментом для подобного рода задач.

Спасибо за внимание! Надеемся, что этот материал был полезен для вас.

Источник

Оцените статью