Как ограничить число фоновых процессов android

Руководство по фоновой работе в Android. Часть 1

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

Будет несколько частей:

  1. Основной поток, осуществление фоновой работы с помощью AsyncTask, публикация результатов в основном потоке.
  2. Затруднения при использовании AsyncTask. Loaders как один из способов их избежать.
  3. Работа в фоне с помощью ThreadPools и EventBus.
  4. RxJava 2 как метод асинхронной работы.
  5. Корутины в Kotlin как метод асинхронной работы.

Начнем с первой части.

Основы UI

Первое, что следует понять, – почему мы вообще беспокоимся о работе в фоне в мобильных приложениях.

Во всех приложениях для Android есть хотя бы один поток, на котором происходит прорисовка UI и обработка пользовательского ввода. Поэтому он и называется потоком UI или главным потоком.

Каждый метод жизненного цикла каждого компонента вашего приложения, включая Activity, Service и BroadcastReceiver, исполняется на UI-потоке.

Человеческий глаз преобразовывает сменяющиеся изображения в плавное видео, если частота смены достигает 60 кадров в секунду (да, это магическое число берется отсюда), давая основному потоку только 16 мc для прорисовки всего экрана.

Продолжительность сетевого вызова может быть в тысячи раз больше.

Когда мы хотим загрузить что-либо из Интернета (прогноз погоды, пробки, сколько стоит ваша часть биткоина в данный момент), мы не должны делать это из главного потока. Более того, Android не позволит нам, выбросив NetworkOnMainThreadException.

Семь лет назад, когда я разрабатывал свои первые приложения на Android, подход от Google был ограничен использованием AsyncTasks. Давайте посмотрим, как мы писали код для общения с сервером (псевдокод преимущественно):

Метод doInBackground() гарантированно будет вызван не на основном потоке. Но на каком? Зависит от реализации. Вот как Android выбирает поток (это часть исходного кода класса AsyncTask):

Здесь можно увидеть, что выполнение зависит от параметра Executor. Посмотрим, откуда он берется:

Как здесь указано, по умолчанию executor ссылается на пул потоков размера 1. Это означает, что все AsyncTasks в вашем приложении запускаются последовательно. Это не всегда было верно, так как для версий ОС от DONUT до HONEYCOMB использовался пул размером от 2 до 4(в зависимости от количества ядер процессора). После HONEYCOMB AsyncTasks снова выполняются последовательно по умолчанию.

Итак, работа выполнена, байты закончили свое длинное путешествие с другого полушария. Нужно превратить их во что-то понятное и разместить на экране. К счастью, наша Activity тут как тут. Давайте поместим результат в одно из наших View.

О, черт! Опять исключение!

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Но мы не делали никаких сетевых обращений на основном потоке! Правильно, но мы попытались нарушить другой закон UI. Пользовательский интерфейс можно менять только из UI-потока. Это верно не только для Android, но и практически для любой системы, с которой вы столкнетесь. Причину этого хорошо объяснили в Java Concurrency In Practice. Вкратце – архитекторы хотели избежать сложной блокировки при изменениях из нескольких источников (пользовательский ввод, биндинг и другие изменения). Использование единственного потока решает эту проблему.

Читайте также:  Как разработать по для андроид

Да, но UI все равно нужно обновлять. У AsyncTask есть еще метод onPostExecute, который вызывается на UI-потоке:

Как эта магия работает? Посмотрим в исходном коде AsyncTask:

AsyncTask использует Handler для вызова onPostExecute в UI, ровно как и метод postOnUiThread в компонентах Android.

Handler прячет всю внутреннюю кухню. Какую именно? Идея состоит в том, чтобы иметь бесконечный цикл проверки сообщений, приходящих на UI-поток, и обрабатывать их соответствующе. Велосипедов тут никто не изобретает, хотя без кручения педалей не обошлось.

Для Android это реализовано классом Looper, который передается в InternalHandler в приведенном выше коде. Суть класса Looper находится в методе loop:

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

Кстати, вы только что узнали, как проверить, вызывается ли ваш код в UI-потоке:

Если вы попытаетесь создать экземпляр Handler в методе doInBackground, то получите другое исключение. Оно сообщит о необходимости наличия Looper для потока. Теперь вы знаете, что это значит.

Надо заметить, что AsyncTask может быть создан только в UI-потоке по указанным выше причинам.
Вы можете подумать, что AsyncTask – это удобный способ выполнения фоновой работы, так как он скрывает сложность и требует немного усилий при использовании, но есть несколько проблем, которые приходится решать по пути:

  • Каждый раз нужно писать достаточно много кода для решения относительно простой задачи
  • AsyncTasks ничего не знают о жизненном цикле. При неправильном обращении лучшее, что вы получите — утечка памяти, в худшем – сбой
  • AsyncTask не поддерживает сохранение состояния прогресса и повторное использование результатов загрузки.

В следующей части я подробно разберу эти проблемы и покажу, как Loaders могут помочь их решить.

Источник

Лимит (ограничение) фоновых процессов на Android — что это и зачем нужно?

Когда полезна опция ограничения фоновых процессов на смартфоне?

Многие приложения на Android работают в фоновом режиме: они активны, даже если пользователь не пользуется этими программами. Наглядными примерами являются антивирусные или банковское ПО, а также мессенджеры и многие другие приложения. Из-за их работы потребляется оперативная память мобильного устройства, что может привести к тормозам и лагам. Особенно критично, когда у смартфона мало ОЗУ — чем больше активных процессов, тем медленнее работает система.

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

Лимит фоновых процессов

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

Опция расположена в настройках смартфона в разделе Для разработчиков«. С помощью функции «Лимит фоновых процессов» можно:

  • Полностью отключить фоновый режим. В этом случае приложения не будут оставаться в активных процессах после отключения.
  • Установить ограничения на количество запущенных приложений, например, чтобы в фоновом режиме работало не более 4 программ.

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

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

Источник

Лимит фоновых процессов в Android — что это, как работает

Что такое лимит фоновых процессов Android?

Android — многозадачная операционная система. То есть она позволяет работать сразу с несколькими приложениями одновременно, хоть и реализовано это несколько иначе, чем в том же Windows. И чем больше оперативной памяти доступно в устройстве — тем больше программ в фоне может работать.

Читайте также:  Обычный телевизор для андроид

Но Android — также одна из самых гибких в плане настроек ОС. Поэтому пользователь, на свое усмотрение, может ограничить количество фоновых утилит, которые будут храниться в ОЗУ.

Лимит фоновых процессов в Android — что это, как работает

По умолчанию в Android всех версий установлено «стандартное ограничение» на работу приложений в фоне. Это означает, что ОЗУ будет заполняться до тех пор, пока не достигнет указанного в ядре максимума и только после этого приложения начнут «выгружаться» из памяти.

Это происходит, когда оперативная память заполняется на 80 – 85% (оставшийся объем ОЗУ резервируется для нормальной работы самого Android и привилегированных системных процессов).

Вручную же пользователь может установить предельное количество программ, которые система будет хранить в оперативной памяти (от 1 до 4, независимо от того, какой объем RAM потребляет каждая из них).

Для чего это необходимо? Функция полезна для устройств с небольшим количеством ОЗУ (до 2 гигабайт).

  • выделить больше RAM под нужды ресурсоемкой программы (под приложение для навигации, которое карту загружает из интернета в реальном времени);
  • увеличить время автономной работы устройства;
  • ускорить отклик интерфейса системы (так как значительная часть ОЗУ будет всегда свободна).

Стоит упомянуть, что даже если задать лимит в 1 приложение, которое будет работать в фоне, то уведомления с тех же мессенджеров всё равно будут приходить. Потому что в современной версии Android за их доставку отвечает сервис GMS-Core.

То есть уведомления приходят на сервер Google, а девайс их запрашивает оттуда через определенные промежутки времени. Именно поэтому тот же Viber, WhatsApp, Telegram всегда держать в фоне не нужно — уведомления о звонках и сообщения всё равно нормально будут доставляться.

Как включить и настроить функцию лимит фоновых процессов

Функция «Лимит фоновых процессов» изначально скрыта в настройках, находится в разделе «Для разработчиков».

Чтобы получить к нему доступ, потребуется:

  1. открыть «Настройки»;
  2. перейти в раздел «О телефоне» (на некоторых моделях он может называться как «О модели», «Общая информация», «Об устройстве»);
  3. найти строку, где указана версия установленной прошивки (номер сборки);
  4. «тапнуть» быстро на эту строку несколько раз, пока не появится уведомление «Поздравляем! Вы разработчик!».

После этого в «Настройках» устройства появится дополнительный раздел «Для разработчиков», где и находится искомая функция.

Но без прямой необходимости менять её стандартное значение не стоит, так как после этого Android будет принудительно останавливать программы в фоне (без сохранения их данных).

Также настройки для «Лимита фоновых процессов» не следует менять на устройствах, работающих под управлением Android Go («облегченная» версия Андроид).

В данной ОС по умолчанию применяется правило «Low Ram», когда часть данных из ОЗУ выгружается в Swap-файл. И если задать ограничение на количество работающих программ в фоне, то это приведёт к частому обращению устройства к накопителю данных.

Это не только может стать причиной возникновения фризов в интерфейсе, но ещё и ускорит разряд АКБ. То есть в Android Go алгоритм выгрузки программ из фона и так довольно активно высвобождает RAM.

Читаем также: что такое оперативная память телефона

Подведём итоги

«Лимит фоновых процессов» — это функция, которая позволяет установить жесткое ограничение на количество программ, которые в Андроид будут работать в фоновом режиме.

По умолчанию же никаких ограничений не действует, ОЗУ заполняется до своего предела, после чего система автоматически выгружает запущенные процессы с минимальным приоритетом.

Источник

—> —> Секретное меню «Для разработчиков». Выжимаем максимум из Android / Все новости / Главная

Большинство пользователей Android не догадывается, что по-умолчанию им доступны далеко не все функции смартфона. В мрачных недрах сокрыто секретное меню “Для разработчиков”, которое позволяет выходить за рамки базовых возможностей. Пусть название этого меню вас не пугает. Часть опций, скрытых в нем, действительно, не нужна простому пользователю. Но есть и такие, которые могут пригодится всем.

Читайте также:  Клавиатура microsoft для андроида

Включение и выключение меню “Для разработчиков”

По-умолчанию само меню “Для разработчиков” недоступно в настройках. Чтобы его активировать, зайдите в настройки и в разделе “О телефоне (О планшете)”. найдите пункт “Номер сборки”. В зависимости от версии Android, “Номер сборки” может находиться в подменю “Сведения о ПО”.

Нажмите на “Номер сборки” семь раз подряд. Это даст вам статус разработчика, а в общих настройках появится соответствующее меню “Для разработчиков”.

Теперь рассмотрим опции, которые могут быть вам интересны в этом меню.

Экран не гаснет при зарядке

Если вы отметите пункт “Не выключать экран”, то смартфон перестанет автоматически блокироваться, когда находится на подзарядке. Не будучи подключенным к зарядному устройству, он будет продолжать гасить дисплей в соответствии с установленными настройками экрана. Опция может быть удобна, если вы, например, используете смартфон в качестве устройства ассистента при работе за компьютером. Чтобы вручную заблокировать смартфон, как обычно, коротко нажмите кнопку питания.

В английской версии опция “Не выключать экран” именуется “Stay awake”.

Лимит фоновых процессов

Опция “Лимит фоновых процессов” позволяет установить жесткое ограничение на количество приложений, работающих в фоновом режиме. По умолчанию установлено “Стандартное ограничение”, но вы можете полностью запретить фоновые приложения, либо установить лимит в размере 1-4 процессов. Опция крайне полезна для слабых смартфонов, от которых требуется выполнение некой ресурсоемкой задачи.

В английской версии опция именуется “Background Process Limit”.

Включение сглаживания

MSAA — сглаживание Multisample anti-aliasing. Активация этого параметра задействует четырехуровневое сглаживание в играх и приложениях с OpenGL ES 2.0. Проще говоря, картинка должна стать более гладкой и красивой. Правда, это потребует от смартфона больше вычислительной мощности. Батарея в играх также начнет разряжаться быстрее.

В английской версии опция именуется “Force 4x MSAA”.

Скорость системной анимации

В разделе “Рисование” имеется параметр “Скорость анимации”, по-умолчанию установленный на “1х”. Если здесь вы отключите анимацию или установите скорость повыше, то, соответственно, меню смартфона будет пролистываться чуточку быстрее. Обратите внимание, это не увеличивает реальную производительность смартфона, но лишь создает иллюзию того, что он работает быстро.

В английской версии опция именуется просто “Animation”.

“Агрессивный Wi-Fi для сотовой связи”

Параметр “Агрессивный Wi-Fi для сотовой связи” имеется в Android начиная с версии 5.0. Это функция, которая автоматически переключает смартфон на мобильные данные, Wi-Fi-соединение оказывается слишком слабым.

Она полезна по двум причинам:

  • Экономия аккумулятора. В обычном режиме, если ваш телефон долго не может подключиться к Wi-Fi, то просто садит батарею, хотя мог бы перейти на мобильный трафик.
  • Уходя из дома, вам не нужно переходить с Wi-Fi на мобильное соединение, смартфон все делает сам.

С другой стороны, опцию нужно использовать осторожно, ведь вы можете не заметить, как смартфон потратит весь ваш мобильный трафик.

В английской версии опция именуется “Aggressive Wi-Fi to mobile handover”.

Статистика процессов

Параметр “Статистика процессов” по своей работе напоминает диспетчер задач Windows. Нажав на него, вы увидите все запущенные процессы и то, сколько оперативной памяти они потребляют. Нажав на конкретный процесс, вы можете его завершить, если, конечно, он не является системным.

В английской версии данная опция называется “Running services”.

Фиктивные местоположения

Опция “Фиктивные местоположения” весьма полезна для сохранения приватности или для обхода некоторых региональных ограничений.

Например, если YouTube пишет, что какое-либо видео недоступно для просмотра в вашем регионе, его можно обмануть. Для этого нужно установить из Google Play одно из приложений, необходимых для смены локации. Таких приложений множество, но самое популярное — Fake GPS location.

Но просто установить “обманку” недостаточно. Чтобы она заработала, нужно в настройках “Для разработчиков” отметить флажком пункт “Фиктивные местоположения”. В английской версии данная опция называется “Allow mock locations”.

Источник

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