Что происходит, когда вы нажимаете значок запуска приложения?

Что происходит, когда вы нажимаете на значок запуска приложения?

  • Является ли новое намерение всегда отправленным или результатом является то же самое, что и возобновление задачи из недавних задач?

  • Если намерение отправлено, когда оно отправляется методу onCreate() нового экземпляра активности и когда он маршрутизируется через onNewIntent() существующего действия?

  • Предположим, что намерение направляется через onNewIntent() существующего действия в задаче. Какую деятельность он отправляет? Тот, который ближе всего к вершине или к ближайшему корню? Будет ли он всегда отправляться на экземпляр действия запуска приложения или может ли он иногда посылаться в действие с той же близостью, что и корень? Может ли он когда-либо быть отправлен в действие, которое не имеет той же близости, что и корень?

  • Наконец, как все это влияет на различные режимы запуска (стандартный, один верхний, один экземпляр, одна задача) из действий в задаче?

Если есть кто-то, кто понимает все это, пожалуйста, помогите мне!

Ответ 1

What happens when you click on an app launch icon?

Приложения запуска вызывают startActivity с намерением [action = Intent.ACTION_MAIN, category = Intent.CATEGORY_LAUNCHER и flag = Intent.FLAG_ACTIVITY_NEW_TASK].

Относительно Intent.FLAG_ACTIVITY_NEW_TASK, из документов:

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

Основы onNewIntent:

onNewIntent доставляется только тогда, когда активность установила singleTask запуска singleTask и singleInstance. Он также доставляется, если действие установило singleTop запуска singleTop или намерение запустить действие установило флаг FLAG_ACTIVITY_SINGLE_TOP и экземпляр действия уже находится в верхней части целевой задачи. Это означает, что была предпринята попытка запустить новый экземпляр действия, вместо этого сам существующий экземпляр должен обработать намерение.

Вот ответ на ваши запросы:

Всегда ли отправляется новое намерение или результат иногда совпадает с возобновлением задачи из недавних задач?

Если задача уже запущена, она выводится на передний план. Если для запуска действия был использован флаг FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, а затем задача FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET на передний план, действие прекращается. Из документов:

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

-

Если намерение отправлено, когда оно отправляется методу onCreate() нового экземпляра действия и когда оно маршрутизируется через onNewIntent() существующего действия?

onCreate вызывается при создании нового экземпляра действия. onNewIntent вызывается, если уже существует экземпляр действия и не требуется создавать новый экземпляр, как в случае singleInstance, singleTask и условно singleTop (как описано выше).

Предположим, что намерение направляется через onNewIntent() существующего действия в задаче. На какую деятельность он отправляется? Ближайший к вершине или ближайший к корню? Будет ли оно всегда отправляться экземпляру действия по запуску приложения или может иногда отправляться в действие с той же привязкой, что и корень? Может ли оно когда-либо быть отправлено деятельности, которая не имеет такой же близости, как корень?

В случае singleTask и singleInstance это должно быть корнем задачи. В случае singleTop это должно быть singleTop задачей задачи.

Наконец, как все это влияет на различные режимы запуска (стандартный, один верх, один экземпляр, одна задача) действий в задаче?

Я надеюсь, что объяснение, предоставленное до сих пор, отвечает на него.

Обновление 1:

Вот код Launcher, который добавляет флаги к намерению:

void processShortcut(Intent intent) {
    ....
    Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
    mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
    ....
}

void startActivitySafely(Intent intent) {
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    ...
    startActivity(intent);
}