Запускаю приложение. Работает. Сворачиваю или открываю поверх другое приложение и моё приложение перестаёт работать (идёт постоянный обмен по сети). Как заставить работать приложение в фоновом режиме?
Отслеживать
задан 13 июл 2015 в 7:31
2,044 22 22 серебряных знака 49 49 бронзовых знаков
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Для начала надо изучить жизненный цикл компонентов приложения.
Если вы осуществляете сетевой обмен в Activity, то это не правильно. Как только Вы скрываете Activity, или открываете другое приложение, оно (Activity) «замирает». Чтобы сетевой обмен проходил в фоне, его надо осуществлять в сервисе. Соответственно изучайте как работать с сервисами.
Вот тут есть хороший урок на тему сервиса и на тему Foreground
Отслеживать
ответ дан 13 июл 2015 в 7:40
Konstantin Pl Konstantin Pl
560 3 3 серебряных знака 14 14 бронзовых знаков
Попробуйте сделать через Background Service
Отслеживать
ответ дан 13 июл 2015 в 7:43
5,640 1 1 золотой знак 9 9 серебряных знаков 17 17 бронзовых знаков
Как разрешить Android-приложению работать в фоновом режиме на телефоне Xiaomi.
-
Важное на Мете
Связанные
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Источник: ru.stackoverflow.com
Телефоны Huawei: как управлять фоновыми приложениями
На смартфоне современного человека установлено множество приложений, некоторые из которых присутствовали по умолчанию, а остальную часть пользователь загрузил самостоятельно. Все эти программы так или иначе расходуют ресурсы смартфона, но только в том случае, если находятся в рабочем состоянии. Приложение полностью закрыто?
Значит оно никак не повлияет на скорость работы устройства, а только будет занимать небольшое количество памяти. А вот что такое фоновый режим в телефоне Андроид? Это более интересный вопрос, на который мы и постараемся ответить дальше.
Освоить запуск фоновых приложений
Закрытие приложений в фоновом режиме напрямую связано с управление батареей и поэтому нам придется выполнить некоторые шаги, если мы не хотим, чтобы наши приложения закрывались автоматически, когда EMUI решит, что они не нужны. Для этого нам нужно будет войти в Настройки> Батарея> Запуск приложений.
В этом разделе у нас есть возможность отметить автоматическое управление всеми приложениями, что может привести к тому, что мы не будем получать уведомления. Чтобы предотвратить закрытие этих приложений, нам нужно вручную отмечать заявки что нам все равно, если они закроют и снимают галку со всех тех, на кого мы не хотим, чтобы их затрагивали.
Ограничение фоновых процессов
Устройство Android Nougat (7.0 или 7.1)
- Установите драйверы USB для вашего устройства OEM (Google предоставляет список некоторых универсальных USB-драйверов здесь).
- Загрузите код ADB для вашей конкретной ОС (Windows, Mac, Linux). Эти ссылки всегда указывают на последнюю версию файла.
- Извлеките содержимое ZIP-файла в папку на вашем ПК.
- Откройте «Настройки» на телефоне и нажмите «О телефоне».
- Найдите номер сборки и коснитесь его 7 раз, чтобы включить режим разработчика.
- Вернитесь в главное меню «Настройки» и включите «Параметры разработчика», чтобы вы могли включить режим «Отладка USB».
- Подключите телефон к компьютеру и переведите его из режима «только зарядка» в режим «передача файлов (MTP)». Это не обязательно, но многие устройства требуют этого в качестве меры безопасности, прежде чем разрешить работать ADB.
- Вернитесь к компьютеру и перейдите в папку, в которую вы извлекли файлы ADB.
- Запустите командную строку или терминал в своем каталоге ADB. Для пользователей Windows это можно сделать, удерживая Shift и щелкнув правой кнопкой мыши, затем выбрав опцию «открыть командную строку». (Некоторые пользователи Windows 10 могут увидеть «командную строку», замененную на «PowerShell».)
- Когда вы находитесь в командной строке или в среде терминала, введите следующую команду: adb devices
- Это запустит установщик ADB, если он еще не запущен, просто дождитесь его завершения. Если вы впервые используете ADB, вы также увидите сообщение на своем телефоне с просьбой разрешить подключение к компьютеру. Разрешите доступ к USB-отладке.
- Теперь, если вы повторно запустите команду adb devices на шаге 10, командная строка / терминал напечатает серийный номер вашего устройства. Если да, тогда вы готовы двигаться дальше. Если нет, то скорее всего не работают драйверы USB.
- Затем вам нужно будет найти имя пакета приложения, у которого вы хотите заморозить фоновые процессы. Вы можете сделать это, установив приложение App Inspector на свой телефон. Шаг 1: Нажмите «Список приложений» Шаг 2. Найдите приложение, которое вам нужно. (Например, «Компас») Шаг 3: Найдите имя пакета под именем приложения (например, «com.huawei.compass»)
- Вернитесь к командной строке и введите следующую команду: adb shell
- Теперь выполните следующую команду для освобождения фоновых процессов приложения: cmd appops set имя_пакета> RUN_IN_BACKGROUND ignore
- Если вы захотите вернуть сделанное изменение и снова разрешить фоновый процесс приложения, введите эту команду: cmd appops set RUN_IN_BACKGROUND allow
- Если не получили сообщение о ошибке значит все сделали правильно и все сработало
Расширенная настройка в экстремальных случаях
После того, как мы выполнили предыдущие шаги, у нас больше не должно возникнуть проблем с закрытием приложений в фоновом режиме с помощью EMUI, хотя вполне вероятно, что некоторые приложения, которые нам нужны, постоянно будут затронуты. Эта конфигурация может напрямую повлиять на батарею и поэтому мы рекомендуем использовать его только в особых случаях.
Сначала нам нужно будет войти в Настройки> Приложения и уведомления> Приложения> Специальный доступ, где мы можем увидеть ряд опций, среди которых оптимизация батареи. В этом разделе у нас есть возможность выбрать конкретное приложение для не позволяет управлять батареей по желанию, не закрывая его в фоновом режиме.
Руководство по фоновой работе в Android. Часть 1
О фоновой работе приложений в 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-потоке:
public void onPostExecutre(Forecast forecast)
Как эта магия работает? Посмотрим в исходном коде AsyncTask:
AsyncTask использует Handler для вызова onPostExecute в UI, ровно как и метод postOnUiThread в компонентах Android.
Handler прячет всю внутреннюю кухню. Какую именно? Идея состоит в том, чтобы иметь бесконечный цикл проверки сообщений, приходящих на UI-поток, и обрабатывать их соответствующе. Велосипедов тут никто не изобретает, хотя без кручения педалей не обошлось.
Для Android это реализовано классом Looper, который передается в InternalHandler в приведенном выше коде. Суть класса Looper находится в методе loop:
Он просто опрашивает очередь входящих сообщений в бесконечном цикле и обрабатывает эти сообщения. Это означает, что на UI-потоке должен быть инициализированный экземпляр Looper. Можно получить доступ к нему с помощью статического метода:
public static Looper getMainLooper()
Кстати, вы только что узнали, как проверить, вызывается ли ваш код в UI-потоке:
Если вы попытаетесь создать экземпляр Handler в методе doInBackground, то получите другое исключение. Оно сообщит о необходимости наличия Looper для потока. Теперь вы знаете, что это значит.
Надо заметить, что AsyncTask может быть создан только в UI-потоке по указанным выше причинам. Вы можете подумать, что AsyncTask – это удобный способ выполнения фоновой работы, так как он скрывает сложность и требует немного усилий при использовании, но есть несколько проблем, которые приходится решать по пути:
- Каждый раз нужно писать достаточно много кода для решения относительно простой задачи
- AsyncTasks ничего не знают о жизненном цикле. При неправильном обращении лучшее, что вы получите — утечка памяти, в худшем – сбой
- AsyncTask не поддерживает сохранение состояния прогресса и повторное использование результатов загрузки.
В следующей части я подробно разберу эти проблемы и покажу, как Loaders могут помочь их решить.
Единственный способ избежать закрытия некоторых приложений
Поскольку операционная система выполняет всю работу за нас, нам придется контролировать только в случае, если мы прекратим получать уведомления или что-то в этом роде. Мы сделаем это с помощью следующих шагов:
- Нам нужно будет получить доступ к настройкам устройства и искать приложения.
- Среди приложений мы выберем любое.
- Внутри мы выберем вариант батареи
- И мы нажимаем на оптимизацию батареи.
Список будет отображаться со всеми приложениями без оптимизации, и поэтому они закрываются при необходимости, а также со многими другими, которые уже оптимизированы по умолчанию и которые закрыть на заднем плане , Мы собираемся выбрать те, которые уже оптимизированы, и перейдем к той, которую мы хотим изменить. Нажав на него, мы сможем внести изменения и переключаться между оптимизацией, чтобы не оптимизировать, имея в виду, что это окажет важное влияние на батарею.
Приложения, которые кажутся недоступными, оставляют нас в сложной ситуации, так как у нас нет возможности исправить их ни в многозадачном режиме, ни сделать какую-либо хитрость, чтобы избежать этого.
Как включить фоновый режим приложений на iPhone?
Теперь несколько слов о «яблочных» мобильных гаджетах. Фоновый режим включить в них тоже можно. Для примера возьмем iPhone (хотя по большому счету без разницы, какое устройство будет использоваться).
Сначала нужно скачать небольшую бесплатную утилиту под названием Backgrounder (сделать это можно на компьютере через сервис Sydia, поскольку в «родном» хранилище этого приложения нет). Далее следует загрузить инсталлятор на устройство через iTunes и установить программу. Желательно создать нужный каталог вручную, скопировать в него инсталляционный файл и установить приложение туда же.
Обратите внимание: после установки иконка приложения в списке апплетов создана не будет, поэтому искать ее среди инсталлированных программ не имеет смысла. Кроме того, в файловом менеджере категорически запрещается удалять или перемещать папку установки, поскольку после этого приложение системой распознано не будет.
Что касается включения фонового режима, тут все просто. При запуске какой-то программы, когда она полностью откроется, нужно нажать на кнопку Home и удерживать ее в течение примерно 3 секунд. После этого появится сообщение об активации утилиты Backgrounder, и приложение свернется. Для восстановления исходного состояния программы снова используется та же кнопка с удерживанием, но после этого появляется сообщение о деактивации утилиты, за чем последует выход приложения из фонового режима.
Источник: dns-magazin.ru