Ответ 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);
}