Подтвердить что ты не робот

Разница между Intent.FLAG_ACTIVITY_CLEAR_TASK и Intent.FLAG_ACTIVITY_TASK_ON_HOME

Из документации для Android:

FLAG_ACTIVITY_CLEAR_TASK

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

и

FLAG_ACTIVITY_TASK_ON_HOME

Если задано в Intent, переданном Context.startActivity(), этот флаг будет заставляют новую задачу запуска размещаться поверх текущего дома (если есть). То есть, отступая от задачи всегда будет возвращать пользователя на дом, даже если это не последний которую они видели. Это можно использовать только в сочетании с FLAG_ACTIVITY_NEW_TASK.

Рассмотрим эти два фрагмента:

Intent intent = new Intent(this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

и

Intent intent = new Intent(this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
startActivity(intent);

Как я понимаю, в любом фрагменте кода мы создаем новую задачу, в которой есть только Activity, и когда вы нажимаете назад, вы переходите на главный экран. Предполагая, что я, вероятно, ошибаюсь, каковы различия между ними? Кроме того, если бы у меня был другой фрагмент с Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME | Intent.FLAG_ACTIVITY_CLEAR_TASK, как это будет выглядеть?

4b9b3361

Ответ 1

Существует разница между двумя фрагментами. Вот некоторая важная справочная информация:

  • Задача содержит стек действий. Задача может быть на переднем плане или в фоновом режиме.

  • Задачи также "сложены". Если вы находитесь в задаче A и вы начинаете новую задачу B, задача B укладывается поверх задачи A. Если пользователь нажимает клавишу BACK достаточно времени в задаче B, он в конечном итоге вернется в задачу `A. Это стандартное поведение Android.

Ваш фрагмент...

Intent intent = new Intent(this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

... выполнит 1 из следующих вещей, в зависимости...

  • Если Activity имеет ту же близость задачи, что и текущая задача (то есть: задача, из которой выполняется этот код), она очистит текущую задачу (завершит все действия в задаче) и запустит новый экземпляр Activity в текущую задачу. Если пользователь нажимает клавишу BACK, это завершает Activity, а также завершает текущую задачу (поскольку в задаче всего 1 активность) и возвращает пользователя либо на экран HOME, либо на задание, которое запустило эту задачу (задача то есть под этой задачей в стеке задач).
  • Если Activity имеет другую близость задачи, чем текущая задача, и уже существует существующая задача с такой близостью задачи (то есть: существующая задача, к которой будет принадлежать Activity), тогда эта существующая задача передняя часть, очищенная (все действия в задании завершены), в корне задачи создается новый экземпляр Activity, и эта задача ставится поверх текущей задачи (так что, когда Activity заканчивается, пользователь возвращается в текущую задачу).
  • Если Activity имеет другую близость задачи, чем текущая задача, и нет существующей задачи с этой привязкой задачи, создается новая задача и создается новый экземпляр Activity в корне задачи и эта задача ставится поверх текущей задачи (так что, когда Activity заканчивается, пользователь возвращается к текущей задаче).

Этот фрагмент кода...

Intent intent = new Intent(this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
startActivity(intent);

... будет делать одну из следующих вещей, зависящих от...

  • Если Activity имеет ту же близость задачи, что и текущая задача (то есть: задача, из которой выполняется этот код), а Activity - это корневая активность текущей задачи, это ничего не сделает. Он не запустит новую задачу, он не очистит какие-либо действия, не создаст новый экземпляр Activity и не изменит поведение того, что произойдет, когда текущая задача будет завершена (т.е.: если текущая задача была запущена другой задачей, когда все действия в текущей задаче закончены, она вернет пользователя обратно в предыдущую задачу в стеке задач).
  • Если Activity имеет ту же близость задачи, что и текущая задача (то есть: задача, из которой выполняется этот код), а Activity - не корневая активность текущей задачи, это просто создаст новый экземпляр Activity и добавит его поверх текущей активности в текущей задаче. Он не запустит новую задачу, он не очистит какие-либо действия и не изменит поведение того, что произойдет, когда текущая задача будет завершена (например: если текущая задача была запущена другой задачей, когда все действия в текущей задача завершена, она вернет пользователя обратно в предыдущую задачу в стеке задач).
  • Если Activity имеет другую близость задачи, чем текущая задача, и уже существует существующая задача с этой аффинностью задачи (то есть: существующая задача, к которой будет принадлежать Activity), а Activity - это корневая активность этой существующей задачи, то существующая задача выносится на передний план и эта задача отделена от стека задач (то есть: когда все действия в этой задаче закончены, она вернет пользователя на экран HOME и не к задаче, которая запустила эту задачу).
  • Если Activity имеет другую близость задачи, чем текущая задача, и уже существует существующая задача с этим сродством к задаче (т.е. существующая задача, к которой будет принадлежать Activity), а Activity - не корневой активности этой существующей задачи, то существующая задача выводится на передний план и эта задача отделена от стека задач (то есть: когда все действия в этой задаче завершены, она вернет пользователя к HOME и не для задачи, которая начала эту задачу), и создается новый экземпляр Activity и помещается поверх всех существующих действий в этой задаче.
  • Если Activity имеет другую близость задачи, чем текущая задача, и нет существующей задачи с этой привязкой задачи, создается новая задача и создается новый экземпляр Activity в корне задачи и новая задача отделена от стека задач (так что, когда заканчивается Activity, пользователь возвращается на экран HOME и не к задаче, которая его запускала).

и, наконец, этот фрагмент...

Intent intent = new Intent(this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
startActivity(intent);

... выполнит 1 из следующих вещей, в зависимости...

  • Если Activity имеет ту же близость задачи, что и текущая задача (то есть: задача, из которой выполняется этот код), она очистит текущую задачу (завершит все действия в задаче) и запустит новый экземпляр Activity в текущую задачу. Если пользователь нажимает клавишу BACK, это завершает Activity, а также завершает текущую задачу (поскольку в задаче всего 1 активность) и возвращает пользователя на экран HOME.
  • Если Activity имеет другую близость задачи, чем текущая задача, и уже существует существующая задача с такой близостью задачи (то есть: существующая задача, к которой будет принадлежать Activity), тогда эта существующая задача передняя часть, очищенная (все действия в задании завершены), в корне задачи создается новый экземпляр Activity, и эта задача отделена от стека задач (так что, когда Activity заканчивается, пользователь вернулся на экран HOME).
  • Если Activity имеет другую близость задачи, чем текущая задача, и нет существующей задачи с этой привязкой задачи, создается новая задача и создается новый экземпляр Activity в корне задачи и эта задача отделена от стека задач (так что, когда Activity заканчивается, пользователь возвращается на экран HOME).

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