Как сделать чтобы приложение работало в фоновом режиме андроид
О фоновой работе приложений в Android есть много статей, но мне не удалось найти подробного руководства по реализации работы в фоне – думаю, из-за того, что появляется все больше новых инструментов для такой работы. Поэтому я решил написать серию статей о принципах, инструментах и методах асинхронной работы в приложениях под Android.
Будет несколько частей:
- Основной поток, осуществление фоновой работы с помощью AsyncTask, публикация результатов в основном потоке.
- Затруднения при использовании AsyncTask. Loaders как один из способов их избежать.
- Работа в фоне с помощью ThreadPools и EventBus.
- RxJava 2 как метод асинхронной работы.
- Корутины в Kotlin как метод асинхронной работы.
Начнем с первой части.
Первое, что следует понять, – почему мы вообще беспокоимся о работе в фоне в мобильных приложениях.
Во всех приложениях для 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.
Для Android это реализовано классом Looper, который передается в InternalHandler в приведенном выше коде. Суть класса Looper находится в методе loop:
Кстати, вы только что узнали, как проверить, вызывается ли ваш код в UI-потоке:
Если вы попытаетесь создать экземпляр Handler в методе doInBackground, то получите другое исключение. Оно сообщит о необходимости наличия Looper для потока. Теперь вы знаете, что это значит.
Надо заметить, что AsyncTask может быть создан только в UI-потоке по указанным выше причинам.
Вы можете подумать, что AsyncTask – это удобный способ выполнения фоновой работы, так как он скрывает сложность и требует немного усилий при использовании, но есть несколько проблем, которые приходится решать по пути:
- Каждый раз нужно писать достаточно много кода для решения относительно простой задачи
- AsyncTasks ничего не знают о жизненном цикле. При неправильном обращении лучшее, что вы получите — утечка памяти, в худшем – сбой
- AsyncTask не поддерживает сохранение состояния прогресса и повторное использование результатов загрузки.
В следующей части я подробно разберу эти проблемы и покажу, как Loaders могут помочь их решить.
Автозапуск приложений — это процесс, сопровождающийся самопроизвольной загрузкой какого-либо приложения, либо одной из его частей для выполнения задач в фоновом режиме. Фоновый режим же — это активная работа процесса в закрытом состоянии. То есть, даже если вы не используете программу, она работает. Большинство программ сейчас работает в Android по такому принципу.
Из статьи вы узнаете
Какие программы работают в фоновом режиме?
Всего есть два типа приложений, работающих в фоновом режиме, а именно:
- С автозапуском;
- С активной работой в фоне.
Приложения с автозапуском. Активируются вместе с системой и работают в фоновом режиме всегда. К таким программам можно отнести клиенты, мессенджеры, утилиты для отображения погоды, лаунчеры, виджеты и так далее. Они никогда не выключаются и остаются в фоновом режиме.
Приложения с активной работой в фоне. Это программы, которые находятся в данном режиме только при активной работе. Например, вы начали установку любимой игры из Google Play. Сервис будет загружать файл, даже если вы в этот момент занимаетесь другими процессами на телефоне. Как только игра будет уставлена, Play Market сам выгрузится из фонового режима и не будет там появляться, пока пользователь снова не попытается что-то скачать/переустановить/обновить. К таким приложениям относятся плееры, загрузчики, торренты, браузеры и так далее.
Какие последствия от приложений, постоянно работающих в фоновом режиме?
Чтобы вычислить норму для вашего аппарата, воспользуйтесь простой формулой: посмотрите сколько у вас приложений работает в фоновом режиме. Все эти утилиты показаны в настройках, в разделе «Память» и отображаются как работающие процессы. Если их много, но все они занимают где-то 10-40 MB, то большого вреда они не нанесут. Зачастую такие приложения висят в автозапуске для более быстрого старта, для поиска обновлений, отправки анонимной статистики, попытке получить новые уведомления и так далее.
Если в фоне висит приложение, которое очень часто используется, и оно занимает мизерное количество оперативной памяти – не трогайте его. Но если очень редко его запускаете, а оно все равно висит в активных задачах – смело отключайте.
Особое внимание обратите на программы, занимающие от 10% оперативной памяти. Их стоит по максимуму отключать. Но если среди них есть необходимые вам мессенджеры, сервисы Google и прочие важные процессы, то их лучше оставить. Аналогия проста: если часто пользуетесь утилитой или программой, то не стоит их отключать. Вполне нормально, когда в фоне работает около 10 приложений, из которых 5 вовсе не используется так часто.
Как отключить приложение из автозапуска?
Чисто технически отключить приложение из автозапуска нельзя. Но можно ограничить его работу в фоне. Для этого выполните действия, описанные ниже.
Инструкция для Android 8, 9, 10 и выше
Таким образом можно легко отключать приложения из автозапуска, просто выключая их работу в фоновом режиме.
Андроид – продуманная операционная система, поэтому она сама распознает процессы и программы, которые могут работать в фоне и позволяет отключать это. А если приложение не может работать в данном режиме и автоматически запускаться, этого ползунка не будет предусмотрено изначально.
Инструкция для Android 7 и ниже
Если у вас более старая версия, то вам стоит выполнить ряд следующих действий. Они также могут быть полезны и для Android Oreo версий:
Использование All-In-One Toolbox
-
Установите All-In-One Toolbox из официального магазина с помощью представленной ниже кнопки.
Практически каждый владелец смартфона под управлением операционной системы Андроид слышал о таком понятии, как «фоновый режим», или встречал его на специализированных ресурсах или форумах, посвященных мобильным телефонам. Не все точно знают, что он означает, поэтому в этом материале будет подробно рассказано, что такое фоновый режим в телефоне Андроид, зачем он нужен и как устроена эта технология.
Что такое фоновый режим в телефоне Андроид
Фоновая работа – полезная особенность ОС Андроид
Фоновый режим – это специальный режим работы некоторых компонентов операционной системы, при котором приложения и процессы программ работают без ведома пользователя и без его непосредственного участия. В пример можно привести какой-либо мессенджер. Человек вроде бы закрыл его и не видит, как он работает.
Некоторые примеры не такие положительные. В ОС Андроид есть множество предустановленных сервисов Гугл, которые активничают даже тогда, когда человек не пользуется ими. Они способны «съедать» приличную часть системных ресурсов при фоновой работе, использовать лимитированный интернет-трафик при загрузке обновлений и так далее. Самое плохое, что удалить их без наличия рут прав не получится. Их можно только отключить.
Для чего это нужно
Приложения, которые работают в фоновом режиме, чаще всего не тратят много системных ресурсов и подключаются к глобальной сети только в том случае, если пользователь находится недалеко от знакомой точки доступа Wi-Fi. Они регулярно взаимодействуют с сетью на предмет каких-либо важных обновлений, оповещают об этом человека и спрашивают, стоит ли установить его или нужно подождать.
Картинка 2 Мониторинг процессов, работающих в фоновом режиме
Чем отличается от фоновой передача данных
Кроме фонового режима на девайсах имеется фоновая передача данных. Эта функция способна определять режим учета, отправки и получения каких-либо данных на фоне. Если эта опция будет активирована, то приложения при наличии доступа в глобальную сеть будут получать к ней доступ. Отключив же функцию передачи, человек будет позволять программе или игре получать выход в сеть лишь тогда, когда она будет запущена и активна.
Как работает фоновый режим на Андроиде
Фоновый режим работает по аналогии с компьютерной версией этой технологии, ведь изначально он появился на десктопных операционных системах и лишь потом перекочевал на мобильные платформы по типу Андроид, iOS или Windows Mobile.
Принцип его действия заключается в запуске программ в скрытом режиме, при котором они не мешают пользователю и не влияют на общую производительность системы, но при этом активно продолжают выполнять свои специфические функции:
Всего у приложений на телефоне под управлением ОС Андроид есть несколько состояний работы:
- Активное. Приложение активно работает.
- Неактивное. Программа была запущена и на данный момент находится в фоновом режиме, но не выполняет каких-либо действий из-за перехода девайса в режима сна и т.д.
- Фоновое. Окна программы не на текущем экране, но оно все еще работает в свернутом виде.
- Остановленное. Приложение не выполняет свои функции, но находится в памяти устройства.
- Незапущенное. Программа была удалена из списка активно выполняющегося ПО или не была запущена вообще.
Картинка 3 Запрет на использование фона
Включение и отключение фонового режима на Андроиде
После знакомства с вопросом о том, что такое фоновое подключение в Андроид, необходимо разобрать, как отключить фоновый режим на Андроиде. Пользователь спокойно может удалить некоторые программы из фона или наоборот добавить их туда.
Полностью отключить режим нельзя, но можно выключить передачу данных. Для этого:
- Переходят в параметры своего телефона.
- Выбирают раздел «Беспроводные сети» или «Мобильный интернет».
- Находят пункт «Передача данных» и параметр «Предупреждения и лимит».
- Устанавливают определенные предупреждения, когда софт тратит больше трафика, чем он должен и ограничивают потребление интернета в случае исчерпания лимита.
Способы сократить количество активных пользовательских процессов через инженерное меню
«Убить» некоторые процессы, работающие на фоне, через инженерное меню – крайне неудобно. Некоторые варианты для процессоров MTK вообще не предоставляют такой возможности, поэтому рекомендуется пользоваться специальными приложениями или самостоятельно чистить автозагрузку.
Очистка автозагрузки
Не все знают, как остановить приложение на Андроиде. На самом деле, можно включать и отключать фон для каждой программы по отдельности. Это поможет только до перезапуска, поэтому следует чистить автозагрузку телефона. Для этого можно воспользоваться специализированной программой, так как стандартных решений для этого не предусмотрено.
Одна из них – All-In-One Toolbox, позволяющая ускорить девайс за счет удаления ненужных приложений, который сильно тормозят ОС при загрузке телефона. Это также избавляет от фоновых процессов, которыми сопровождается запуск приложений в авторазгрузке.
Важно! То же самое можно проделать и вручную, но придется удалять программы или останавливать их активность для каждой отдельно. Для этого переходят в настройки, находят раздел с ПО и останавливают часть запущенных приложений.
Картинка 4 Остановка программы позволяет убрать ее из автозапуска
Как посмотреть список процессов, работающих в фоне на Андроиде
Для того чтобы ознакомиться со списком активных и работающих на фоне приложений, необходимо скачать программу Greenify или вышеописанное решение (All-In-One Toolbox). Сразу же после входа перед человек появляются все активные процессы с возможностью их отключения и «усыпления».
Если скачивать стороннее ПО не хочется, то можно воспользоваться стандартным решением:
- Перейти в параметры устройства.
- Найти раздел «Приложения».
- Выбрать вкладку «Активные».
- Просмотреть список и по желанию удалить некоторый софт из памяти путем его остановки.
Картинка 5 Интерфейс Greenify
Преимущества и недостатки фоновой работы приложений на Android
Если говорить о преимуществах работы на фоне, то стоит выделить следующие:
- Частичная автоматизация выполняемых процессов обновления ПО или уведомления человека, которые не требуют его вмешательства.
- Рост функциональности мобильного аппарата и операционной системы.
- Расширение функции мультизадачности, когда девайс выполняет сразу несколько процедур.
Важно! Есть у данного подхода и минусы, основной из которых заключается в высоком потреблении энергии аккумулятора девайса. Когда службы активно работают, то телефон не может войти в режим сна и сохранить автономность работы на пару часов больше.
Картинка 6 Работа в All-In-One Toolbox
Какие фоновые процессы на Android нельзя останавливать
Если руководствоваться принципом, что остановить следует те приложения, которые тратят самый большой процент зарядки аккумуляторной батареи и те, которые занимают больше всего ОЗУ, то это порой может привести не туда. Все дело в том, что наибольшее количество ресурсов и зарядки тратит сама операционная система и ее компоненты. Остальное распределяется между системными и пользовательскими приложениями.
Начинать нужно с программ, в названии которых есть слово «Google». Делать это нужно спокойно и без фанатизма, хотя сколько-нибудь действительно важные сервисы и службы просто не дадут себя закрыть и остановить. Не стоит закрывать и такие программы: Google Search, Google Play services, Google Contacts Sync, Google Keyboard, Google Play Store. Все остальное, если человек этим не пользуется, может быть остановлено. Руководствоваться при этом нужно списком статистики использования системных ресурсов и энергопотребления.
Картинка 7 Анализ траты системных ресурсов
Теперь вопрос о том, как отключить фоновые приложения на Андроид, закрыт. Сегодня есть много программ для работы с фоном, позволяющих настроить, разрешить или запретить запуск тех или иных служб или процессов.
В процессе взаимодействия со смартфоном человек пользуется самыми разными приложениями. Многие ошибочно полагают, что программа начинает работать только после того, как владелец устройства кликнет по ее иконке. Но это не так. Часть приложений работает без участия пользователя. Такой режим работы называется фоновым.
О подобном режиме работы до сих пор идут ожесточенные споры. Кто-то считает его незаменимым, в то время как другие люди не видят в нем смысла. Чтобы разобраться в принципах функционирования режима, а также в том, нужно ли его принудительно отключать, потребуется изучить все тонкости. А в заключении привести доводы «за» и «против».
Как работает фоновый режим на Андроиде
Функционирование без участия пользователя – размытое объяснение работы фонового режима. Новичок вряд ли поймет, что действительно представляет собой данная опция. Поэтому наш эксперт подготовил ответы на самые распространенные вопросы.
Эксперт в области цифровых технологий и деятельности мобильных операторов. Занимаюсь постоянным мониторингом изменений отрасли в России и за рубежом. Данная опция полезна для тех, кто хочет получать уведомления от приложений. Например, мессенджеров или соцсетей. Если фоновый режим не включен, оповещения приходить не будут. Нет. Многие приложения попросту не приспособлены к такому режиму и работа в фоне для них является бессмысленной. В качестве примера здесь можно привести карты или оффлайн-игры. Нет. Решению по поводу того, стоит ли активировать опцию, предпринимает владелец мобильного устройства. Но многие люди включают режим случайно при первом запуске приложения. Вместе с неоспоримыми плюсами опция негативным образом влияет на функционирование устройства. Слабый смартфон начинает медленнее. А все устройства без исключения разряжаются быстрее, поскольку фоновая работа зачастую потребляет не меньше энергии, чем в стандартном режиме.Преимущества и недостатки фонового режима
Разобравшись в принципе работы данной опции, можно составит итоговое мнение относительно «фона». Режим имеет как плюсы, так и минусы, которые обязательно нужно учитывать перед использованием.
Бесперебойное получение уведомлений от всех программ Замечается увеличение расхода аккумулятора за единицу времениВряд ли какой-то один плюс или минус заставит владельца девайса сделать выбор «за» или «против» фоновых процессов. Нужно рассматривать вопрос в комплексе, принимая во внимание все аспекты.
Несмотря на выделенные недостатки, смартфон без «фона» лишается своих основных функций. Человек запросто может пропустить важное уведомление.
При лобовом сравнении плюсов и минусов становится ясно, что без фонового режима современному пользователю не обойтись. Ведь все-таки смартфон – устройство для общения, на которое регулярно будут поступать уведомления от других людей через мессенджеры и соцсети. Отказываясь от «фона», человек самостоятельно принимает решение ограничить себя в общении.
Кроме того, процессы, функционирующие без участия пользователя, продолжают работу, когда владелец занят другими делами. В качестве примера можно привести рендеринг видео. Вряд ли кто-то будет ждать 30-60 минут с открытой программой, пока монтируется ролик. В это время большинство людей запустить другое приложение, чтобы посмотреть видео или сыграть партию в любимой игре. Опять же, без фонового режима сделать это было бы невозможно.
Но и о недостатках все равно нельзя забывать. Поскольку «фон» негативным образом влияет на производительность и автономность, рекомендуется активировать специфический режим не для всех доступных программ, а лишь для основных. О том, как это сделать, расскажем далее.
Как включить фоновый режим на телефоне
Принимая во внимание все минусы «фона», даже скептик поймет, что без этой опции невозможно полноценно пользоваться смартфоном. Режим все равно должен работать, а потому следует задуматься о его активации.
Чтобы программы самостоятельно начинали функционировать без вмешательства пользователя, понадобится открыть настройки телефона и перейти в раздел «Активность приложений». Здесь требуется снять ограничения, чтобы проги могли передавать данные и присылать уведомления на мобильное устройство.
Если необходимо разрешить «фон» только для отдельных программ, рекомендуется перейти в подраздел «Управление приложениями». Здесь выставляются разрешения для прог по отдельности. Это очень удобно, если вы заботитесь о производительности и автономности своего смартфона.
Также следует разрешить для каждого конкретного приложения автозапуск. Главным образом это будет иметь решающее значение для мессенджеров, которые должны быть всегда готовы вовремя отобразить уведомления. Как правило, соответствующая опция располагается по пути Настройки – Разрешения – Автозапуск. Но в зависимости от модели устройства итоговое расположение может отличаться.
Такие программы, как ivi или Google Play Музыка, указанные на скриншоте, можно запретить. Точнее – ограничить автозапуск. Дело в том, что онлайн-кинотеатры и другие подобные программы обычно не присылают уведомления. Их работа в фоне лишь нагружает устройство, заставляя пользователя часто ставить смартфон на зарядку.
Не забывайте, что приложение автоматически переходит в фон после запуска. Его можно запустить с того же места через меню активных процессов (диспетчер задач).
Как отключить фоновый режим на Андроиде
Деактивация работы в фоне происходит по тому же сценарию, что и включение. То есть пользователю необходимо открыть настройки и перейти в раздел с разрешениями для программ. Если для включения рекомендовалось снять запреты, то в данном случае их нужно выставить снова.
Кроме того, программы можно закрыть принудительно. Это будет полезно в тех случаях, когда по каким-то причинам работа в фоне не ограничивается через настроек. То же самое касается запущенных программ, находящихся в оперативной памяти.
Откройте диспетчер задач удержанием кнопки «Домой» или свайпом от нижнего края экрана к верхнему. В списке запущенных программ можно закрыть одну, несколько или сразу все, нажав кнопку в виде крестика.
Альтернативный вариант – закрытие через пункт настроек телефона «Приложения». Здесь вы можете принудительно остановить функционирование каждой программы в отдельности. Иногда именно этот способ является наиболее удобным.
А еще помогают ограничить фоновые процессы специальные программы. В Google Play есть огромное количество софта, которое позволяет оптимизировать работу устройства и улучшить автономность. Принцип их действия как раз-таки заключается в закрытии «фона». Так что данный вариант тоже стоит рассмотреть в том случае, если стандартные методы так и не помогли. Об одной из таких программ подробно рассказывается на видео ниже.
Читайте также: