Ответ 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
имеет специальный режим запуска)...