Стоит ли останавливать приложения на Android
Тут каждый должен решить для себя сам, стоит ли ему останавливать приложения на Android. Для себя я уже на автомате выработал цепочку действий. Когда я запускаю приложение, которым пользуюсь раз в месяц, я его всегда закрываю. Если я пользовался картами, то тоже стараюсь это сделать. Но когда дело доходит до мессенджеров, то я оставляю их в свернутом режиме.
Так же я поступаю и с другими приложениями, которые не особо требовательны к телефону, но я постоянно ими пользуюсь. Планировщики задач, напоминания, мессенджеры, календари, звонилка (само собой) и другие подобные приложения висят у меня в фоне, так как просто нет смысла тратить время на их закрытие, а через 20 минут ждать лишние несколько секунд, пока они запустятся.
Что такое сложные проблемы
Посмотрите на две задачи. Подумайте, как бы вы их решили и чем они отличаются.
Задача 1. Мать поручила сыну принести домой ровно 7 л воды с реки. Она дала ему два кувшина емкостью 3 и 5 л. Как мальчик может отмерить точно 7 л воды, используя только два этих кувшина?
Задача 2. Вообразите, что регулярные частные полеты на орбиту Земли стали возможны и сопоставимы по стоимости с среднестатистическим путешествием в другую страну. Подумайте, что делать представителям туристической индустрии на Земле? Запишите мысли, которые придут в голову.
Первая задача — это «задачка». У нее есть конкретный правильный ответ, к которому можно прийти через ряд вычислений. Это фрагмент классического Стэнфордского теста Термана на измерение интеллекта «The Measurement of Intelligence» 1916 года. Правильное и быстрое решение подобных задач показывает высокие значения в тестах когнитивных способностей и уже более 100 лет вызывает горячие дискуссии в профессиональном исследовательском сообществе. Однако, даже несмотря на высокие когнитивные способности, люди склонны попадать в ментальные ловушки, принимать решения на основе ошибочных предположений и опираться на стереотипные представления.
Вторая задача — это сложная «проблема». У нее нет единственно правильного решения. Есть большое количество факторов, которые нужно учесть, и условий, которые будут формировать разные сценарии; при этом существенную роль будет играть эмоциональный фон решающего.
В управленческой практике у менеджеров есть все необходимые данные для принятия решений и решения проблем. По данным Гарвардского исследования, 68% руководителей уверены в точности большей части данных, лежащих в основе их бизнес-решений. То есть, когнитивные способности обеспечивают возможность решать проблемы, но качество решений не от них.
Что такое принятие решений и решение проблем
Каждый день мы принимаем сотни решений, которые влияют на нашу жизнь: по разным оценкам только относительно еды их количество доходит до 225 в день. Решения часто оказываются неудачными, нам приходится работать с их последствиями и принимать новые решения. По данным Росстата за 2019 год, в России на 1 000 браков пришлось 653 развода, а за последние 15 лет индустрия сведения татуировок выросла на 440%.
Неэффективные, неуместные, необоснованные решения в бизнесе и управлении встречаются не реже, чем в бытовых ситуациях. Пять лет назад Мировой Экономический Форум в Давосе сделал прогноз, какие компетенции будут определять профессионала будущего в 2020 году. Сейчас это будущее уже наступило. Компетенции, связанные с принятием решений, остаются в ТОП-10 самых важных навыков, а решение сложных проблем занимает лидирующую позицию.
Прогноз 2016 года о самых востребованных навыках будущего — в 2020 году
(Фото: World Economic Forum)
Решение проблем и принятие решений часто смешивают или используют как синонимы. Корректно их разделять, при этом рассматривать в одном «семействе» компетенций РППР (PSDM) — Решение Проблем и Принятие Решений (Problem Solving & Decision Making).
К PSDM обычно относят:
- Системное мышление.
- Стратегическое мышление.
- Критический анализ информации.
- Осознанность в принятии решений.
- Взаимодействие со стейкхолдерами.
- Креативный подход к решению проблем.
- Лидерство в условиях неопределенности.
- Стимулирование организационных изменений.
Большинство компаний, которые я консультирую, добавляют хотя бы два-три навыка из этого списка в модели корпоративных компетенций или эталонные профили должности. При этом чем выше управленческая позиция, тем серьезнее требования бизнеса и меняющегося ландшафта к уровню этих компетенций. Здесь есть две новости: хорошая и не очень.
Хорошая новость в том, что научные сообщества давно изучают PSDM с разных сторон. Например, Ариэль Рубинштейн развил концепцию Герберта Саймона о нашей ограниченной рациональности и рассмотрел наши решения в русле институциональной экономики и теории игр. Психологи-когнитивисты Дэниел Канеман, лауреат Нобелевской премии по экономике в 2002 году и Амос Тверски описали, как мы ищем «короткие» пути в решении сложных задач, но попадаем в ловушки и предубеждения. А социолог Барри Шварц в книге «Парадокс выбора» объяснил, почему большой выбор затрудняет принятие решений и приводит к ощущению неудовлетворенности.
Новость, которая не очень. Ни исследовательское, ни бизнес-сообщество до сих пор не решили, что именно считать решением: взгляды на природу решений разные, а единого определения — нет.
Пример 1.
1. Определение проблемы: сколы хрома на рабочей поверхности поршневых колец 7511-1004044.2. Изучение ситуации: по данным отдела контроля качества (ОКК), увеличился % брака по сколам. В силу техпроцесса сколы можно рассмотреть только при окончательном контроле. Были выявлены предполагаемые операции, на которых было возможно появление сколов.3. Выявление причин: создана группа. Проведена беседа с операторами. Был проведен ряд экспериментов. Запущены опытные партии, которые отслеживались технологами, и на которых производился 100% контроль в ОКК после каждой операции. Была выявлена причина: неправильная очередность операций.4. Воздействие на причины: поменяли очередность операций.5. Проверка результатов: как написано выше, все партии проходили 100% контроль, все данные записывались в журнал. По итогам изучения журнала было выявлено, что партии, прошедшие при смене операций, имели меньший % сколов. Поэтому было принято решение, что в течение месяца работаем в такой очередности операций.6. Закрепление изменений: по прошествии месяца % брака по сколам на рабочей поверхности намного снизился. Технологическим отделом был изменен технологический процесс (карты потока) обработки поршневых колец 7511-1004044.7. Извлечение уроков: командная работа, вот что позволяет более качественно и быстро решить возникшую проблему.
Случай 3. Цепочка сетевых вызовов
Для сетевых вызовов, которые необходимо выполнить последовательно (т.е. когда каждая операция зависит от ответа / результата предыдущей операции), вам нужно быть особенно осторожным при создании спагетти кода.
Например, вам может потребоваться выполнить запрос к API с помощью токена, который вам нужно сначала получить через другой запрос к API.
Вариант 1. AsyncTask или загрузчики
Использование или загрузчиков почти наверняка приведет к спагетти коду. Общую функциональность будет трудно реализовать правильно, и для вашего проекта потребуется огромное количество избыточного шаблонного кода.
Вариант 2. RxJava с использованием flatMap
В RxJava оператор берет исходящее значение из наблюдаемого источника и возвращает другого наблюдателя. Вы можете создать одного наблюдателя, а затем другого, и использовать исходящее значение из первого, для их связи.
Шаг 1. Создайте наблюдателя, который извлекает токен:
Шаг 2. Создайте наблюдателя, который получает данные с помощью токена:
Шаг 3. Цепочка двух наблюдателей вместе и подписка:
Обратите внимание, что использование этого подхода не ограничивается сетевыми вызовами; Он может работать с любым набором действий, которые должны выполняться в последовательности, но в отдельных потоках. Все приведенные выше примеры использования довольно просты
Переключение между потоками происходило только после завершения каждой задачи. Более продвинутые сценарии, например, когда два или более потока должны активно взаимодействовать друг с другом, могут также поддерживаться этим подходом
Все приведенные выше примеры использования довольно просты. Переключение между потоками происходило только после завершения каждой задачи. Более продвинутые сценарии, например, когда два или более потока должны активно взаимодействовать друг с другом, могут также поддерживаться этим подходом.
История из жизни #3
При обработке продукции «Х» на участке «Y» в ночную смену возникла проблема с поломкой режущего инструмента на станке «Z». Во избежание длительного простоя под командованием мастера, имеющего навыки «Кулибина», наладчик дорабатывает «на коленке» оснастку и ставит проверенный временем режущий инструмент. Участок после инноваций благополучно дорабатывает смену.
Утром мастер докладывает о проделанных ночью подвигах начальнику цеха и просит его вызвать технологов для внесения официальных изменений в оснастке и картах техпроцесса.
После продукции «Х» участок обрабатывал еще несколько видов продукции и через месяц возвращается к «Х». Проблема опять прилетела к тому же мастеру и наладчику. Оказалось, никто и пальцем не пошевелил для закрепления решения. Понятное дело, ресурсов и желания повторно «выкручиваться» у пары умельцев не было.
Простой повлек срыв заказа, и прямо пропорциональное уменьшение премии. Только после этого провели инженерные мероприятия.
—
Ещё несколько историй из жизни к этому модулю.
Использование фоновых потоков
Чтобы быть уверенным, что ваше приложение не теряет отзывчивости, хорошим решением станет перемещение всех медленных, трудоёмких операций из главного потока приложения в дочерний.
Все компоненты приложения в Android, включая активности, сервисы и приёмники широковещательных намерений, начинают работу в главном потоке приложения. В результате трудоёмкие операции в любом из этих компонентов блокируют все остальные части приложения, включая сервисы и активности на переднем плане.
Применение фоновых потоков — необходимое условие, если вы хотите избежать появления диалогового окна для принудительного закрытия приложения. Когда активность в Android на протяжении 5 секунд не отвечает на события пользовательского ввода (например, нажатие кнопки) или приёмник широковещательных намерений не завершает работу обработчика onReceive() в течение 10 секунд, считается, что приложение зависло. Подобные ситуации следует избегать любой ценой. Используйте фоновые потоки для всех трудоёмких операций, включая работу с файлами, сетевые запросы, транзакции в базах данных и сложные вычисления.
Android предоставляет несколько механизмов перемещения функциональности в фоновый режим.
- Activity.runOnUiThread(Runnable)
- View.post(Runnable)
- View.postDelayed(Runnable, long)
- Handlers
- AsyncTask
Класс AsyncTask позволяет определить операции, которые будут выполняться в фоне, вы также будете иметь доступ к обработчику событий, что позволит отслеживать прогресс выполнения задач и выводить результаты в контексте главного графического потока. Подробнее об этом классе в отдельной статье.
Хотя использование AsyncTask — хорошее решение, случается, что для работы в фоновом режиме приходится создавать собственные потоки и управлять ими.
В Java есть стандартный класс Thread, который вы можете использовать следующим образом:
Данный способ подходит только для операций, связанных с временем. Но вы не сможете обновлять графический интерфейс программы.
Если вам нужно обновлять интерфейс программы, то нужно использовать AsyncTask, о котором говорилось выше, или вы можете реализовать ваш собственный класс, наследованный от Thread, используя объект Handler из пакета android.os для синхронизации с потоком GUI перед обновлением пользовательского интерфейса.
Вы можете создавать дочерние потоки и управлять ими с помощью класса Handler, а также классов, доступных в пространстве имён java.lang.Thread. Ниже показан простой каркас для переноса операций в дочерний поток.
Clean Master
Следующая программа — это Clean Master, один из самых популярных убийц приложений в Play Store, который предлагает тонну функций. Приложение включает в себя очистку мусора, бесплатный антивирус, облачное хранилище для фотографий, расширение для браузера, ускоритель телефона за счет чистки оперативной памяти, увеличение времени работы батареи и утилиту, которая удаляет ненужные файлы из WhatsApp. Одним словом, это достаточно большой функционал для одного приложения, что делает Clean Master очень полезным.
Специальный помощник в приложении выдает список программ, которые тратят много заряда аккумулятора, и предлагает отключить их. Clean Master также ведет статистику, демонстрирующую влияние отключения приложения на работу батареи, отображая часы службы батареи, которые вы получите, отключив те или иные приложения.
ShutApp
ShutApp позволит немедленно отключать приложения, использующие заряд батареи, одним нажатием. Инструмент прост в использовании и разделен на три части. Поэтому можно отключить отдельные приложения, ввести процессор в гибернацию в режиме ожидания или настроить функции вроде WiFi, Bluetooth и синхронизацию на автоматическое отключение, когда они не используются.
Решение «гибернация в одно нажатие» выполняется, чтобы помочь значительно сохранить заряд батареи. Единственная причина, по которой это приложение в конце списка, — это раздражающие полноэкранные рекламные объявления, которые всплывают довольно часто. В программе есть возможность отключить рекламу и раскрыть все функции. Так что, если реклама будет раздражать, просто купите платную версию приложения.
Какие программы работают в фоновом режиме?
Всего есть два типа приложений, работающих в фоновом режиме, а именно:
- С автозапуском;
- С активной работой в фоне.
Приложения с автозапуском. Активируются вместе с системой и работают в фоновом режиме всегда. К таким программам можно отнести клиенты, мессенджеры, утилиты для отображения погоды, лаунчеры, виджеты и так далее. Они никогда не выключаются и остаются в фоновом режиме.
Приложения с активной работой в фоне. Это программы, которые находятся в данном режиме только при активной работе. Например, вы начали установку любимой игры из Google Play. Сервис будет загружать файл, даже если вы в этот момент занимаетесь другими процессами на телефоне. Как только игра будет уставлена, Play Market сам выгрузится из фонового режима и не будет там появляться, пока пользователь снова не попытается что-то скачать/переустановить/обновить. К таким приложениям относятся плееры, загрузчики, торренты, браузеры и так далее.
Как отключить приложение из автозапуска?
Чисто технически отключить приложение из автозапуска нельзя. Но можно ограничить его работу в фоне. Для этого выполните действия, описанные ниже.
Инструкция для Android 8, 9, 10 и выше
- Зайдите в «Настройки» смартфона и найдите пункт «Приложения и уведомления», откройте его.
Откройте список всех приложений, кликнув по вкладке «Сведения о приложениях».
Откройте приложение, которое по вашему мнению нужно выключить в фоновом режиме, то есть, убрать из автозагрузки. Для более удобного поиска можно воспользоваться алфавитным ползунком слева или поиском вверху справа.
Открыв программу, в ней кликните по вкладке «Батарея».
В пункте «Батарея» найдите ползунок «Работа в фоновом режиме» и выключите его. Также рекомендуем перейти в пункт «Батарея» и установить статус приложения на «Экономить заряд батареи».
Таким образом можно легко отключать приложения из автозапуска, просто выключая их работу в фоновом режиме.
Инструкция для Android 7 и ниже
Если у вас более старая версия, то вам стоит выполнить ряд следующих действий. Они также могут быть полезны и для Android Oreo версий:
- Зайдите в «Настройки» смартфона и найдите пункт «О телефоне» или «Система» в самом низу списка.
Нажмите на пункт «Номер сборки» несколько раз, пока не появится вкладка «Для разработчиков». Затем вернитесь на главный экран настроек и откройте там пункт «Для разработчиков».
В этом пункте найдите вкладку «Неактивные приложения» и через нее легко отключайте активные процессы.
Использование All-In-One Toolbox
Это многофункциональное приложение, основная задача которого — оптимизация работы операционной системы Андроид. Среди доступных инструментов предоставляется возможность остановить автозагрузку некоторых системных и большинства пользовательских приложений.
- Установите All-In-One Toolbox из официального магазина с помощью представленной ниже кнопки.
Developer:
Price:
Free
После первого запуска необходимо предоставить доступ к мультимедиа и другим файлам в памяти устройства. Для этого нажмите кнопку «Разрешить».
Опуститесь в нижнюю часть страницы и откройте раздел «Автозагрузка». Здесь можно отключить автозапуск для выбранных приложений для быстрого старта устройства.
Вы можете исключить из автозагрузки как сразу все пользовательские и системные приложения, так и одно или несколько конкретных.
Пример 2.
1. Определение проблемы: забоины на донышке поршня.2. Изучение ситуации: при установке поршня на базирующую часть станка, исполнитель задевает поршнем об оснастку, создавая забоину.3. Выявление причин: края оснастки металлические, острые.4. Воздействие на причины: изготовить фторопластовое кольцо для скрытия острых краев оснастки.5. Проверка результатов: обработка опытной партии на данном оборудовании. Причина устранена, забоины отсутствуют.6. Закрепление изменений: внести изменения в чертеж оснастки, распространить на все участки.7. Извлечение уроков: все контактирующие поверхности должны быть изготовлены из фторопласта, либо иметь радиус на краях оснастки.
ES Task Manager
Если вы являетесь владельцем телефона на Android, то уже возможно слышал о ES Task Manager — убийце приложений от того же разработчика, что и ES File Explorer. В нем есть диспетчер задач, очистка кэша, менеджер загрузки устройства, оптимизатор работы батареи, анализ карты памяти и многое другое.
В этом помощнике доступна функция отключения всех программ одним нажатием. Впрочем, данная опция может раздражать тех, кто не собирался отключать все инструменты сразу. Менеджер запуска — полезное дополнение, позволяющее исключить ненужные приложения из списка тех, которые запускаются вместе с включением смартфона. ES Task Manager незаменим для тех, кто хотел бы одним нажатием ускорить работу телефона.
Случай 4. Общение c UI потоком из другого потока
Рассмотрим сценарий, в котором вы хотите загрузить файл и обновить пользовательский интерфейс после его завершения.
Поскольку загрузка файла может занять много времени, нет необходимости держать пользователя в ожидании. Вы можете использовать сервис и, возможно, для реализации функциональности в нем.
Однако, в этом случае, более сложная задача заключается в возможности вызвать метод в потоке пользовательского интерфейса после завершения загрузки файла (который был выполнен в отдельном потоке).
Вариант 1. RxJava внутри сервиса
RxJava, как самостоятельно, так и внутри , может быть не идеальным решением. Вам нужно будет использовать механизм обратного вызова при подписке на , а построен для выполнения простых синхронных, а не обратных вызовов.
С другой стороны, с помощью вам необходимо будет вручную остановить службу, что потребует дополнительной работы.
Вариант 2. BroadcastReceiver
Android предоставляет компонент, который может слушать глобальные события (например, события батареи, сетевые события и т.д.), А также настраиваемые события. Вы можете использовать этот компонент для создания настраиваемого события, которое запускается при завершении загрузки.
Для этого вам нужно создать собственный класс, который расширяет , регистрирует его в манифесте и использует и для создания настраиваемого события. Чтобы инициировать событие, вам понадобится метод .
Манифест:
Получатель:
Отправитель:
Такой подход является жизнеспособным вариантом. Но, как вы заметили, это связано с некоторой работой, и слишком много передач могут замедлить работу.
Вариант 3. Использование Handler
— это компонент, который может быть присоединен к потоку, а затем быть использованным для выполнения некоторых действий в этом потоке с помощью простых сообщений или Runnable задач. Он работает совместно с другим компонентом — , который отвечает за обработку сообщений в конкретном потоке.
Когда создается, он может получить объект в конструкторе, который указывает, к какому потоку он прикреплен. Если вы хотите использовать Handler, прикрепленный к основному потоку, вам нужно использовать looper, связанный с основным потоком, вызывая .
В этом случае для обновления пользовательского интерфейса из фонового потока вы можете создать Handler, подключенный к потоку пользовательского интерфейса, а затем опубликовать действие как :
Этот подход намного лучше, чем первый, но есть еще более простой способ сделать это…
Вариант 3. Использование EventBus
— это популярная библиотека от GreenRobot, позволяет компонентам безопасно связываться друг с другом. Поскольку наш вариант использования — это тот, где мы хотим обновить интерфейс, это может быть самым простым и безопасным способом.
Шаг 1. Создайте класс событий. Например, .
Шаг 2. Подпишитесь на событие.
Шаг 3. Отправьте событие:
С помощью параметра в аннотации вы указываете поток, по которому вы хотите подписаться на это событие. В нашем примере здесь мы выбираем основной поток, так как мы хотим, чтобы получатель события смог обновить интерфейс.
Вы можете структурировать свой класс , чтобы он содержал дополнительную информацию по мере необходимости.
В сервисе:
В активности / фрагменте:
Используя библиотеку , связь между потоками становится намного проще.
Незакрытые андроид-приложения продолжают работать в фоновом режим?
Отчасти это так, однако «работать» – не совсем подходящее слово. Для начала нужно разобраться в теории. Практически все android-приложения состоят из двух основных частей:
- Видимая пользователю часть.
- Часть, которую пользователь не видит.
Первое – эта та часть, с которой взаимодействует человек после нажатия на ярлык приложения. В оперативной памяти в это время находятся графические ресурсы этого приложения и всевозможные временные файлы. Контроллер приложений дает возможность переключаться между недавно открывавшимися программами, возвращаясь на то же место, где вы остановились.
Переключаться между программами без потери данных можно до тех пор, пока мобильному устройству хватает ОЗУ. Как только заканчивается оперативная память, с которой могут работать приложения, операционная система начинает выгружать из памяти те приложения, которые давно не использовались, таким образом освобождая место в ней для используемых программ.
Ручное закрытие приложения и автоматическая выгрузка – практически одно и то же. При таких операциях из ОЗУ выгружается видимая пользователю часть приложения. Несохраненный прогресс будет утерян, а при повторном запуске программы пользователь увидит ее главный экран.
Приложения из меню многозадачности нельзя назвать полноценно работающими. На самом деле они являются лишь кэшированными данными, которые никак не влияют на производительность мобильного устройства и остаются в ОЗУ лишь для того, чтобы пользователь мог быстро вернуться к месту, на котором остановился.
Задание
Скачайте форму отчета.
Изучите учебный материал и заполните Часть 1 Отчета.
Прочитайте Приложение 2. Выберите пять правил решения проблем, которые наиболее близки вам, которые вы считаете самыми важными.
Просмотрите пять прилагаемых файлов, где описаны методики решения проблем (1х1, 8D, DMAIC, PDCA, А3). Знакомы ли вам какие-то из этих методик? Используются какие-то из этих методик в вашей компании? Какая из методик понравилась вам больше других?
У вас, скорее всего, есть проблемы, которые мешают вашей работе. Выберите одну из них и попробуйте решить ее, используя алгоритм Джойнера.
Заполните Часть 2 Отчета.
Обсудите пункты 3, 4 и 5 из этого задания на встрече группы.
На встрече выберите какую-нибудь проблему участника группы. Попробуйте поработать группой с этой проблемой с помощью алгоритма Джойнера
Обсудите первые два шага:
Определение проблемы — здесь вы можете обсудить и дать ответы практически на все пункты.
Изучение ситуации — здесь вы можете группой спланировать действия «владельца» проблемы по сбору информации: определить, какие факты и данные нужны для решения проблемы и где (у кого) их можно добыть, получить.
Пусть каждый ответит на три вопроса: Что в этой теме для меня самое важное? Что я изменю в своей практике, что начну применять? Какие сложности вижу в применении? После выступления каждого остальные задают вопросы, дают обратную связь.
Заполните Часть 3 Отчета.