Флаги запуска activity android

Содержание
  1. Русские Блоги
  2. Стек задач Activity.Режим задачи и запуска, а также подробное описание флага Intent.
  3. Что такое стек задач (Task)
  4. Зачем использовать стек задач
  5. Как просмотреть стек задач текущей системы
  6. Обзорный экран
  7. Особенности активности в Задаче:
  8. Атрибуты и идентификация намерения действия, которое влияет на задачу
  9. Какой режим запуска Activity (LaunchMode)
  10. Эти четыре режима влияют на стек задач, в котором находится Activity.
  11. standard
  12. singleTop
  13. onNewIntent () использует подсказки
  14. Сценарии применения
  15. singleTask
  16. Сначала найти задачу
  17. Начать деятельность
  18. Сводка активности установлена ​​в singleTask
  19. Сценарии применения
  20. singleInstance
  21. подводить итоги
  22. Сценарии применения
  23. Часто используемый флаг намерения
  24. FLAG_ACTIVITY_NEW_TASK
  25. FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | FLAG_ACTIVITY_NEW_DOCUMENT (API21)
  26. FLAG_ACTIVITY_MULTIPLE_TASK
  27. FLAG_ACTIVITY_CLEAR_TASK
  28. FLAG_ACTIVITY_SINGLE_TOP
  29. FLAG_ACTIVITY_CLEAR_TOP
  30. FLAG_ACTIVITY_REORDER_TO_FRONT
  31. FLAG_ACTIVITY_BROUGHT_TO_FRONT
  32. FLAG_ACTIVITY_NO_HISTORY
  33. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
  34. FLAG_ACTIVITY_FORWARD_RESULT
  35. FLAG_ACTIVITY_NO_USER_ACTION
  36. FLAG_ACTIVITY_RETAIN_IN_RECENTS (API21)
  37. FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
  38. FLAG_ACTIVITY_PREVIOUS_IS_TOP
  39. FLAG_ACTIVITY_TASK_ON_HOME
  40. FLAG_EXCLUDE_STOPPED_PACKAGES
  41. FLAG_DEBUG_LOG_RESOLUTION
  42. Атрибуты деятельности, связанные с задачей
  43. allowTaskReparenting
  44. alwaysRetainTaskState
  45. clearTaskOnLaunch
  46. finishOnTaskLaunch
  47. documentLaunchMode
  48. Tasks и Back Stack в Android
  49. Маленький итог
  50. Управление тасками
  51. Атрибут launchMode
  52. Флаги
  53. Affinity
  54. Чистка стека

Русские Блоги

Стек задач Activity.Режим задачи и запуска, а также подробное описание флага Intent.

Что такое стек задач (Task)

Официальный документ объясняет это так

Задача — это серия действий, которые взаимодействуют с пользователем при выполнении определенной работы. Эти действия расположены в стеке («стеке возврата») в том порядке, в котором они открываются.

Фактически, это запись действий, которые открываются последовательно в структуре стека (первый пришел и последний вышел).

Зачем использовать стек задач

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

Как просмотреть стек задач текущей системы

В телефоне -> Нажмите и удерживайте кнопку домой или многозадачность, чтобы войтиОбзорный экран Интерфейс
В командной строке -> активность dumpsys оболочки adb

Обзорный экран

Экран обзора (также известный как экран последней активности, список недавних задач или недавно использованное приложение) представляет собой пользовательский интерфейс системного уровня, в котором перечислены недавно посещенные действия и задачи. Пользователь может просмотреть список и выбрать задачу для восстановления или удалить ее из списка, проведя пальцем по экрану, чтобы очистить задачу. Для версии Android 5.0 (уровень API 21) несколько экземпляров одного действия, содержащего несколько документов, могут отображаться на обзорном экране как задачи. Например, Google Диск может выполнять задачу для каждого из нескольких документов Google. Каждый документ отображается на обзорном экране как задача.

Особенности активности в Задаче:

  1. Может поступать из разных приложений
  2. Может работать в разных процессах

Атрибуты и идентификация намерения действия, которое влияет на задачу

  1. launchMode
  2. taskAffinity
  3. allowTaskReparenting
  4. clearTaskOnLaunch
  5. alwaysRetainTaskState
  6. finishOnTaskLaunch

Идентификация намерения (четыре напрямую связанных с задачей):

  1. FLAG_ACTIVITY_NEW_TASK
  2. FLAG_ACTIVITY_CLEAR_TOP
  3. FLAG_ACTIVITY_SINGLE_TOP
  4. FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
    .

Какой режим запуска Activity (LaunchMode)

Режим запуска — это просто стратегия при запуске Activity. Установлен атрибут android: launchMode тега в AndroidManifest.xml.
Существует 4 режима запуска: стандартный, singleTop, singleTask, singleInstance;

Эти четыре режима влияют на стек задач, в котором находится Activity.

Использование: добавьте атрибут launchMode в узел активности в файле манифеста.

standard

В режиме по умолчанию при отправке Intent новый экземпляр Activity создается каждый раз, когда он открывается.
Если app1 запускает действие app2, действие APP2 будет автоматически добавлено к задаче, в которой находится действие app1.

В версии 5.0 отсутствует ситуация, когда кросс-приложение начнет работу в новой задаче.Understand Android Activity’s launchMode: standard, singleTop, singleTask and singleInstanceОписание не то же самое

singleTop

Почти так же, как и в стандартном режиме, экземпляров singleTop Activity может быть бесконечно много, с той лишь разницей, что если текущее действие уже находится на вершине стека, новое действие не будет создано.onNewIntent()Отправьте намерение в существующее действие.

  1. Режим singleTop действует только в текущем стеке задач.
  2. Если вы начинаете действие с singleTop, установленным через startActivityForResult, режим singleTop будет недействительным (я не знаю, почему многие люди в Интернете говорят, что установка singleTop также приведет к немедленному возврату resultCode of cancel в onActivityResult. мерка 4.х, 5.х версия нормальная)

onNewIntent () использует подсказки

Сценарии применения

Одним из вариантов использования этого режима запуска является функция поиска. Предположим, мы создаем окно поиска, и когда мы щелкаем для поиска, мы переходим к SearchActivity, который отображает список результатов поиска. Для лучшего взаимодействия с пользователем это поле поиска обычно помещается в SearchActivity, чтобы пользователь хотел выполните поиск снова, нажимать клавишу возврата не нужно.
Представьте, что мы начинаем новое действие каждый раз, когда отображается результат поиска, и выполняем поиск по 10 действиям 10 раз, поэтому, когда мы хотим вернуться к исходному действию, нам нужно нажать 10 Returns.
Итак, мы должны быть такими. Если SearchActivity уже есть наверху стека, мы отправим Intent существующему действию и позволим ему обновить результаты поиска. Таким образом, в верхней части стека будет только одна SearchActivity, и вы сможете вернуться к предыдущему действию одним щелчком мыши.
В любом случае singleTop и его вызывающий объект находятся в одной задаче. Если вы хотите, чтобы намерение было отправлено действию наверху стека в другой задаче, это не сработает.
И когда намерение исходит из другого приложения, метод запуска нового действия такой же, как и в стандартном режиме.

singleTask

Первый выявитьtaskAffinityАтрибуты этой деятельности.

Сравните ЗАДАЧУ с классом, близость больше похожа на название класса этого класса, школа похожа на систему, Activity больше похожа на ученика в классе

Чтобы запустить действие в режиме singleTask, он сначала будет искать его в системе.taskAffinityСтек задач с согласованными атрибутами,

Читайте также:  Виджет часы для планшета андроид

Сначала найти задачу

  1. Если taskAffinity не указано, это текущая задача.
  2. Если указано taskAffinity, сначала найдите задачу в системе, если она не найдена, создайте новую задачу и поместите действие как root.
  • Начать деятельность

    Сводка активности установлена ​​в singleTask

    Сценарии применения

    Сценарии использования этого режима во многом аналогичны почтовому ящику почтового клиента или временной шкале активности социальных приложений (круг друзей).

    singleInstance

    По сути, так же, как «singleTask», Activity всегда является единственным участником задачи, в которой оно находится; любое действие, запущенное в действии, не будет в задаче, в которой оно находится.

    подводить итоги

    1. При использовании в качестве цели startActivityForResult (в дальнейшем это относится к запускаемому действию)
      1. Версия 4.x. Запустить в новом стеке задач и немедленно вернуть resultCode of cancel в onActivityResult в действии, которое его запустило.Характеристики singleInstance по-прежнему
      2. Версия 5.x. Он не будет запускаться в новом стеке задач, а будет запускаться непосредственно в текущем стеке задач (появятся несколько экземпляров), и метод onActivityResult для действия, которое запустило его, будет вызывать обычный вызов после его закрытия.Дело в том, что запущенное им действие будет выполняться в другом новом стеке задач..

    Сценарии применения

    1. Интерфейс входящего вызова вызова InCallScreen

    Часто используемый флаг намерения

    FLAG_ACTIVITY_NEW_TASK

    FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | FLAG_ACTIVITY_NEW_DOCUMENT (API21)

    Если это свойство включено в намерение, действие, к которому оно обращается, и все действия в этом действии будут удалены из задачи при сбросе задачи. Когда мы переводим фоновую задачу обратно на передний план, система при определенных обстоятельствах прикрепляет к этому действию флаг FLAG_ACTIVITY_RESET_TASK_IF_NEEDED, что означает, что задача сбрасывается при необходимости, а затем FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET вступит в силу. После тестирования для приложения в фоновом режиме, если вы щелкните приложение на панели запуска, это действие будет содержать метку FLAG_ACTIVITY_RESET_TASK_IF_NEEDED, нажать и удерживать кнопку «Домой», а затем щелкнуть последнюю запись, это действие не содержит метки FLAG_ACTIVITY_RESET_TASK_IF_NEEDED, поэтому первый будет очищен, второй не встретится.
    Сценарии применения:
    Например, мы хотим выбрать изображение в главном интерфейсе приложения, а затем запустить интерфейс просмотра изображений, но когда приложение восстанавливается из фона на передний план, в Чтобы избежать путаницы для пользователя, мы надеемся, что пользователь Вы по-прежнему будет видеть основной интерфейс вместо интерфейса просмотра изображений.В настоящее время нам нужно добавить эту отметку в Intent, когда мы перейдем к интерфейсу просмотра изображений.

    FLAG_ACTIVITY_MULTIPLE_TASK

    По умолчанию в системе нет диспетчера задач, поэтому при использовании этого тега необходимо убедиться, что вы можете вернуться из запущенной задачи.
    Если FLAG_ACTIVITY_NEW_TASK не установлен, этот тег игнорируется

    FLAG_ACTIVITY_CLEAR_TASK

    FLAG_ACTIVITY_SINGLE_TOP

    FLAG_ACTIVITY_CLEAR_TOP

    FLAG_ACTIVITY_REORDER_TO_FRONT

    FLAG_ACTIVITY_BROUGHT_TO_FRONT

    FLAG_ACTIVITY_NO_HISTORY

    FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

    FLAG_ACTIVITY_FORWARD_RESULT

    FLAG_ACTIVITY_NO_USER_ACTION

    FLAG_ACTIVITY_RETAIN_IN_RECENTS (API21)

    FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

    FLAG_ACTIVITY_PREVIOUS_IS_TOP

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

    Читайте также:  Удаление android studio ubuntu

    FLAG_ACTIVITY_TASK_ON_HOME

    FLAG_EXCLUDE_STOPPED_PACKAGES

    FLAG_DEBUG_LOG_RESOLUTION

    Атрибуты деятельности, связанные с задачей

    allowTaskReparenting

    Следует отметить, что если приложение app1 не запускается снова после того, как приложение app1 переходит в фоновый режим, но приложение app2 запускается напрямую, вышеуказанное явление не произойдет. Действие повторного размещения происходит во время перезапуска appB.

    alwaysRetainTaskState

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

    clearTaskOnLaunch

    finishOnTaskLaunch

    documentLaunchMode

    Для значений, отличных от none и never, действие должно быть определено с помощью launchMode = «standard». Если этот атрибут не указан, используется documentLaunchMode = «none».

    Источник

    Tasks и Back Stack в Android

    Итак. Каждое Android приложение, как минимум, состоит из фундаментальных объектов системы — Activity. Activity — это отдельный экран который имеет свою отдельную логику и UI. Количество Activity в приложении бывает разное, от одного до много. При переходах между различными Activity пользователь всегда может вернуться на предыдущую, закрытую Activity при нажатии кнопки back на устройстве. Подобная логика реализована с помощью стека (Activity Stack). Его организация «last in, first out» — т.е. последний вошел, первый вышел. При открытии новой Activity она становится вершиной, а предыдущая уходит в режим stop. Стек не может перемешиваться, он имеет возможность добавления на вершину новой Activity и удаление верхней текущей. Одна и та же Activity может находиться в стеке, сколько угодно раз.
    Task — это набор Activity. Каждый таск содержит свой стек. В стандартной ситуации, каждое приложение имеет свой таск и свой стек. При сворачивании приложения, таск уходит в background, но не умирает. Он хранит весь свой стек и при очередном открытии приложения через менеджер или через launcher, существующий таск восстановится и продолжит свою работу.

    Ниже покажу картинку, как работает стек.

    Если продолжать нажимать кнопку back, то стек будет удалять Activity до того, пока не останется главная корневая. Если же на ней пользователь нажмет back, приложение закроется и таск умрет. Кстати, я говорил о том, что когда мы сворачиваем наше приложение и запускам например новое, то наш таск просто уходит в background и будет ждать момента, пока мы его вызовем. На самом деле есть одно «но». Если мы будем иметь много задач в background или же просто сильно нагружать свое устройство, не мала вероятность того, что таск умрет из за нехватки системных ресурсов. Это не война конечно, но то что мы потеряем все наши текущие данные и наш стек очистится — это точно. Кстати для избежания потери данных в таком случаи, вам стоит почитать про SavingActivityState.

    Маленький итог

    Управление тасками

    Существует два пути для изменения стандартной организации тасков. Мы можем устанавливать специальные атрибуты в манифесте для каждой Activity. Также мы можем устанавливать специальные флаги для Intent, который запускает новую Activity с помощью startActivity(). Заметьте, что иногда атрибуты в манифесте и флаги в Intent могут противоречить друг другу. В этом случаи флаги Intent будут более приоритетны.

    Атрибут launchMode

    Для каждой Activity в манифесте можно указать атрибут launchMode. Он имеет несколько значений:

    • standard — (по умолчанию) при запуске Activity создается новый экземпляр в стеке. Activity может размещаться в стеке несколько раз
    • singleTop — Activity может распологаться в стеке несколько раз. Новая запись в стеке создается только в том случаи, если данная Activity не расположена в вершине стека. Если она на данный момент является вершиной, то у нее сработает onNewIntent() метод, но она не будет пересоздана
    • singleTask — создает новый таск и устанавливает Activity корнeвой для него, но только в случаи, если экземпляра данной Activity нет ни в одном другом таске. Если Activity уже расположена в каком либо таске, то откроется именно тот экземпляр и вызовется метод onNewIntent(). Она в свое время становится главной, и все верхние экземпляры удаляются, если они есть. Только один экземпляр такой Activity может существовать
    • singleInstance — тоже что и singleTask, но для данной Activity всегда будет создаваться отдельный таск и она будет в ней корневой. Данный флаг указывает, что Activity будет одним и единственным членом своего таска
    Читайте также:  Не могу создать аккаунт google с андроида

    На самом деле не важно, в каком таске открыта новая Activity. При нажатии кнопки back мы все равно вернемся на предыдущий таск и предыдущие Activity. Единственный момент, который нужно учитывать — это параметр singleTask. Если при открытии такой Activity мы достанем ее из другого background таска, то мы полностью переключаемся на него и на его стек. на картинке ниже это продемонстрировано.

    Флаги

    Как и говорил, мы можем устанавливать специальный флаги для Intent, который запускает новую Activity. Флаги более приоритетны, чем launchMode. Существует несколько флагов:

    • FLAG_ACTIVITY_NEW_TASK — запускает Activity в новом таске. Если уже существует таск с экземпляром данной Activity, то этот таск становится активным, и срабатываем метод onNewIntent().
      Флаг аналогичен параметру singleTop описанному выше
    • FLAG_ACTIVITY_SINGLE_TOP — если Activity запускает сама себя, т.е. она находится в вершине стека, то вместо создания нового экземпляра в стеке вызывается метод onNewIntent().
      Флаг аналогичен параметру singleTop описанному выше
    • FLAG_ACTIVITY_CLEAR_TOP — если экземпляр данной Activity уже существует в стеке данного таска, то все Activity, находящиеся поверх нее разрушаются и этот экземпляр становится вершиной стека. Также вызовется onNewIntent()

    Affinity

    Стандартно все Activity нашего приложения работают в одном таске. По желанию мы можем изменять такое поведение и указывать, чтобы в одном приложении Activity работали в разных тасках, или Activity разных приложений работали в одном. Для этого мы можем в манифесте для каждой Activity указывать название таска параметром taskAffinity. Это строковое значение, которое не должно совпадать с названием package, т.к. стандартный таск приложения называется именно как наш пакет. В общем случаи данный параметр указывает, что Activity будет гарантированно открываться в своём отдельном таске. Данный параметр актуален, если мы указываем флаг FLAG_ACTIVITY_NEW_TASK или устанавливаем для Activity атрибут allowTaskReparenting=«true». Этот атрибут указывает, что Activity может перемещаться между тасками, который её запустил и таском, который указан в taskAffinity, если один из них становится активным.

    Чистка стека

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

    • alwaysRetainTaskState — если флаг установлен в true для корневой Activity, то стек не будет чиститься и полностью восстановится даже после длительного времени
    • clearTaskOnLaunch — если установить флаг в true для корневой Activity, то стек будет чиститься моментально, как только пользователь покинет таск. Полная противоположность alwaysRetainTaskState
    • finishOnTaskLaunch — работает аналогично clearTaskOnLaunch, но может устанавливаться на любую Activity и удалять из стека именно её

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

    Источник

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