Автор оригинала: Dancan Yego.
Вы когда-нибудь задумывались, что происходит за кулисами, когда вы нажимаете на значок приложения и приложение запускается..??Это создает стопку действий. Действия расположены в стеке(задний стек) в том порядке, в котором каждое действие открывается Пользователем. Например, в приложении электронной почты может быть одно действие для отображения списка новых сообщений. Когда пользователь выбирает значок мессенджера Whatsapp, открывается новое действие для просмотра этих сообщений. Это новое действие добавляется в задний стек. Если пользователь нажмет кнопку “Назад”, это новое действие будет завершено и удалено из стека.
Каждое действие должно быть разработано вокруг определенного вида действий, которые пользователь может выполнять и может начинать другие действия. из лучшего руководства для разработчиков Android. Android определяет единицу последовательности пользовательских взаимодействий как задачу. Задача – это набор действий, с которыми пользователь взаимодействует при выполнении определенной работы.
поведение задачи и заднего стека.
Средство запуска приложений выполняет еще одну задачу с основным действием, выполняемым и помещаемым в основу заднего стека (у него есть еще одно задание, которое мы проверим позже).
Когда текущее Действие, которое мы создали, запускает другое Действие, то новое действие помещается поверх стека и фокусируется.
Предыдущее действие перемещается ниже нового действия в заднем стеке и останавливается. Система сохраняет текущее состояние пользовательского интерфейса этой текущей деятельности, например, содержимое в структуре, положение прокрутки и так далее.
Действия продолжают складывать заднюю стопку до тех пор, пока не будет нажата кнопка “Назад”
В тот момент, когда нажата кнопка “Назад”, текущее действие переносится с самой высокой точки заднего стека, следовательно, оно уничтожает Действие, и предыдущее действие возобновляется с восстановленным состоянием.
Кнопка “Назад” в этот момент продолжает выводить текущие действия и восстанавливать прошлые упражнения. В тот момент, когда последнее действие удаляется из заднего стека, в этот момент задача заканчивается на экране, который был запущен в последний раз перед выполнением Задачи (для нашей ситуации экран запуска или наше основное действие) До тех пор, пока задний стек не опустеет, пока задача не перестанет существовать, и Действия различных приложений, вызванных намерением, не будут помещены в одну и ту же задачу.
Однако у задачи есть несколько важных свойств:
Задача выводится на передний план при нажатии значка запуска или при его выборе на последних экранах.
Задача переходит в фоновый режим при нажатии кнопки “Домой” или при создании новой задачи.
Когда пользователь оставляет задачу на длительное время или когда он/она оставляет несколько задач в фоновом режиме,память очищается во всех Действиях, кроме корневого действия, для восстановления памяти системой.
Использование тега манифеста Android <активность> с атрибутом android:Режим запуска. Включая флаги в намерение, доставленное в startActivity(). Эти режимы запуска и эквивалентные им флаги startActivity позволяют нам определить, как новый экземпляр Действия связан с текущей Задачей и определяет инструкцию для его запуска в данной Задаче.
Режим запуска — стандартный: Это метод действия по умолчанию. Прямо сейчас создается новое вхождение Действия и помещается в Задачу, с которой оно началось, направляя к нему цель. Деятельность прямо сейчас может быть начата во многих случаях, в каждом случае может быть место с альтернативным поручением, и в одном предприятии могут быть разные примеры.
Режим запуска — синглтоп | баннер — ФЛАГ_АКТИВИТЫ_СИНГЛ_ТОП: Этот режим или баннер обеспечивает то же поведение, что и стандартный режим запуска, если новое действие фактически не присутствует в заднем стеке в качестве верхнего. На тот случай, если он доступен наверху, в этот момент он действует неожиданным образом. Прямо сейчас то же действие возобновляется с вызовом его метода onNewIntent.
launchMode — Однозадачная задача | баннер — ФЛАГ_АКТИВНОСТИ_НОВЫЙ_ЗАДАЧА: Если Действие не существует в ранее выполненной Задаче, в этот момент оно начинает Действие в другой Задаче с новым появлением Действия в основании заднего стека Задачи, в противном случае Задача представляется с восстановленным последним состоянием Действия, и это Действие получает новое ожидание в стратегии onNewIntent. Одновременно может существовать только один пример Деятельности. Прямо сейчас Back catch еще не готов восстановить активность клиента в прошлой задаче.
launchMode — Одиночный экземпляр: Этот режим запуска похож на одиночную задачу, за исключением того, что Система не отправляет какое-либо другое действие в Задачу, проводящую мероприятие. Деятельность последовательно является единственной и главной отдельной от своей Задачи. Любое действие, начатое этим, открывается в другой Задаче.
режим запуска singleTask и singleInstance не подходят для большей части приложений.
баннер — FLAG_ACTIVITY_CLEAR_TASK: Это очищает любое текущее задание, которое было бы связано с Действием, до начала Действия. Это действие в этот момент превращается в новую базу задания, и старые действия выполняются. Он должен быть использован в связи с FLAG_ACTIVITY_NEW_TASK.
Этот конкретный флаг полезен, когда уведомление должно запустить приложение, завершив существующие действия. Например, если мы хотим запустить SplashActivity из службы обработчика обратного вызова уведомлений мы используем
Intent openIntent = new Intent(getApplicationContext(), SplashActivity.class); openIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); getApplicationContext().startActivity(openIntent);
баннер — FLAG_ACTIVITY_CLEAR_TOP: Если начатое Действие теперь выполняется в текущем задании, то, в отличие от запуска нового примера этого Действия, различные упражнения на нем уничтожаются (с призывом к стратегии onDestroy), и эта цель передается в продолжение действия (в настоящее время сверху) с помощью техники onNewIntent.
Примечание: Для FLAG_ACTIVITY_CLEAR_TOP, если режим запуска не описан в AndroidManifest или не установлен как “стандартный” для Действия, то Действие рядом с его вершиной всплывает, и сверху устанавливается другой пример этого действия. Таким образом, стратегия onNewIntent не называется.
Это прискорбно, чаще всего нам нужно было бы повторно использовать Действие и активизировать его состояния представления, такие как информация в кратком изложении, в отношении высшей точки заднего стека, в отличие от разрушения и последующего воспроизведения.
Чтобы выполнить это, мы характеризуем режим запуска данного действия как одиночный Top и вызываем startActivity() с ФЛАГОМ_АКТИВИТИ_КЛИР_ТОП.
Также
Intent intent = new Intent(context, ActivityA.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
Правило приоритета: Если текущее действие добавляет флаг намерения, а начальное действие определило режим запуска, то запрос текущего действия выполняется.
атрибуты манифеста важного действия, относящиеся к заднему стеку.
история: Если это значение равно true, то оно уничтожает текущее действие и удаляет его из заднего стека всякий раз, когда оно запускает какое-либо другое действие. Вам не нужно явно вызывать finish для этого действия. Он эффективен при всплеске активности.
Cleartaskonлаунч: Если это значение равно true, то задний стек очищается до корневого действия всякий раз, когда пользователь покидает задачу и возвращается к ней.
Завершение выполнения задачи: Он похож на clearTaskOnLaunch, но работает с одним действием.
ЗАПИСКА.
Не используйте startActivityForResult для действий в одном приложении, а используйте singleTop и FLAG_ACTIVITY_CLEAR_TOP, как описано выше, для решения проблемы обновления родительского представления при удалении дочернего представления.
Исследование задач и обратных стеков для приложения во время выполнения
На этапе разработки мы должны проверить прикладную задачу и резервный стек в случае, если мы реализовали режим запуска или использовали флаги ожидания. Это должно быть возможно, однако, на свалке данных о действиях.
Шаги, которые необходимо предпринять для этого конкретного обследования:
Создайте и запустите приложение в мобильном телефоне или эмуляторе через Android Studio.
Исследуйте несколько экранов на мобильном устройстве или эмуляторе.
Запустите действие adb shell dumpsys в терминале студии.
Это даст длинное информационное наполнение. Найдите имя пакета вашего приложения.
В разделе ДЕЙСТВИЯ в области ACTIVITYMANAGER мы можем найти все данные о задании и упражнениях в заднем стеке.
Большое вам спасибо, поскольку мы продвигаемся в Курсе разработки Android, Пожалуйста, помогите мне, оставив отзыв в разделе комментариев о том, как я буду совершенствоваться.
Оригинал: “https://www.codementor.io/@dancanyego/what-are-tasks-and-back-stack-in-android-1597ndgazb”