Android default launchMode активности LAUNCHER?

Не launchMode ли launchMode режима launcher activity в manifest ? В документации по android говорится, что стандартный launchMode по умолчанию является «стандартным», но для меня это не логично, если бы это применимо к основной активности приложения, потому что каждый раз, когда вы запускаете приложение, другая task будет создана в instance приложение.

Ну, я сам изучил исходники Android и нашел следующее.

Пусковая установка запускает приложения, используя метод startActivityAsUser в LauncherAppsService . Цель построена с использованием следующих строк:

 Intent launchIntent = new Intent(Intent.ACTION_MAIN); launchIntent.addCategory(Intent.CATEGORY_LAUNCHER); launchIntent.setComponent(component); launchIntent.setSourceBounds(sourceBounds); launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

Согласно документации Android, флаг FLAG_ACTIVITY_NEW_TASK означает:

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

Это эффективно и безоговорочно переопределяет launchMode указанный (или опущенный по умолчанию) в приложении, и игнорирует этот атрибут.

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

Подумайте обо всем, кроме открытия, как абстрактную реализацию. Объявление активности как

  <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> 

Сначала откроет его. Последующие действия переоцениваются в момент формирования намерения для навигации между действиями. Переопределения представляются как флаги намерений.

Список дополнительных заданий: http://developer.android.com/reference/android/content/Intent.html

С флагами, которые вы могли бы написать в манифесте.

Вы смешиваете две вещи. Один из них – launchMode а другой – «что происходит, когда пользователь выбирает значок приложения на экране HOME или выбирает задачу из списка недавних задач». Это две совершенно разные вещи.

launchMode

Каждое действие имеет указанный launchMode (по умолчанию это "standard" или "multiple" . Это говорит Android, как начать эту Activity , и есть много факторов, которые могут способствовать «интерпретации» режима launchMode . Это зависит от того, какие другие флаги Может быть указано в используемом Intent . Это зависит от того, какая задача запрашивала запуск Activity (или если запрос был запрошен из контекста без активности, например, из Service или BroadcastReceiver ). Это зависит от того, существует или нет существующая Экземпляр Activity уже активен в заданной задаче и т. Д.

Поведение при выборе значка приложения на экране HOME или списке установленных приложений

Когда пользователь выбирает значок приложения, startActivity() вызывается с Intent содержащим следующие данные:

  • ACTION = MAIN
  • КАТЕГОРИЯ = LAUNCHER
  • Компоненту присваивается имя пакета и имя класса Activity , которое определено в манифесте с помощью ACTION = MAIN и CATEGORY = LAUNCHER
  • FLAG_ACTIVITY_NEW_TASK FLAG_ACTIVITY_RESET_TASK_IF_NEEDED FLAG_ACTIVITY_NEW_TASK и FLAG_ACTIVITY_RESET_TASK_IF_NEEDED .

Независимо от определения launchMode Activity для Activity , вызывающего startActivity() с таким Intent это приводит к следующему поведению:

Если уже существует существующее задание, совпадение задач которого совпадает с запуском Activity (простым языком, если приложение уже запущено), Android просто перенесет существующую задачу на передний план. Вот и все. Он не создает экземпляр какой-либо Activity . Он не вызывает onNewIntent() для любой Activity . Это не что иное, как перенос существующей задачи на передний план. Вот почему, даже если вы укажете launchMode="standard" для вашей Activity запуска, Android не создает новый экземпляр при каждом нажатии на значок вашего приложения.

Если еще не существует существующей задачи, схожесть задачи которой совпадает с запуском Activity (простым языком, если приложение еще не запущено), Android создаст новую задачу и запустит Activity в эту задачу. launchMode здесь не играет роли, поскольку нет никакой разницы между режимами запуска при запуске одного Activity в новую задачу. Android всегда создает новую задачу и всегда создает новый экземпляр Activity как корень этой задачи.

Такое поведение также является одним и тем же, когда пользователь выбирает задачу из списка последних задач. Если задача все еще запущена, Android просто выводит задачу на передний план, не запускает никаких новых экземпляров Activity и не вызывает onNewIntent() . Если задача больше не запущена, Android создает новую задачу и запускает Activity запуска в эту задачу. Единственное отличие здесь в том, что флаг FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY также задан в Intent если пользователь выбрал задачу из списка последних задач.

Надеюсь, это ответит на ваш вопрос.

См. Этот ответ для очень подробного объяснения FLAG_ACTIVITY_RESET_TASK_IF_NEEDED и FLAG_ACTIVITY_RESET_TASK_IF_NEEDED задачи.

Вы правы. Режим по умолчанию – «стандартный».

Согласно документации android

* В standard режиме каждый раз, когда появляется новое намерение для «стандартного» действия, создается новый экземпляр класса для реагирования на это намерение. Каждый экземпляр обрабатывает одно намерение.

*. Если родительская активность имеет standard режим запуска (и FLAG_ACTIVITY_CLEAR_TOP намерение не содержит FLAG_ACTIVITY_CLEAR_TOP ), текущая активность и ее родительская FLAG_ACTIVITY_CLEAR_TOP из стека, а новый экземпляр родительской активности создается для получения намерения навигации.

Поведение Activity, установленное в стандартном режиме, – это новый Activity, который всегда будет создан для работы отдельно с каждым отправленным Intent. Представьте себе, что если для составления электронной почты отправлено 10 намерений, должно быть выполнено 10 мероприятий, чтобы выполнять каждое намерение отдельно. В результате в устройстве может быть неограниченное количество таких видов деятельности.

Поведение на Android до Lollipop

Стандартная активность будет создана и помещена поверх стека в той же задаче, что и та, которая отправила Intent. Например, когда мы делим изображение из галереи на стандартное действие, оно будет укладываться в ту же задачу, что и описано, хотя они из разных приложений. Если мы переключим приложение на другое, а затем вернемся к Галерее, мы по-прежнему увидим, что стандартное начало запуска находится поверх задачи Галереи. В результате, если нам нужно что-то делать с Gallery, мы должны сначала завершить эту работу в этом дополнительном мероприятии.

Введите описание изображения здесь

Поведение на Android Lollipop

Если действия выполняются из одного и того же приложения, он будет работать так же, как и на pre-Lollipop, уложенном поверх задачи. Но в случае, если намерение отправляется из другого приложения. Будет создана новая задача, и вновь созданная активность будет помещена как корневая операция, как показано ниже.

Введите описание изображения здесь

Источник отсюда