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

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

Ответы

Ответ 1

Хорошо, я сам изучил исходники 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, указанный (или опущенный по умолчанию) в приложении, и игнорирует этот атрибут.

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

Ответ 2

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

        <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

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

Ответ 3

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

launchMode

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

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

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

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

Независимо от определения launchMode 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 и повторения задачи в целом.

Ответ 4

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

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

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

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

Ответ 5

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

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

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

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

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

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

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

Источник здесь