Я нахожусь в процессе (наконец) написания главы о задачах для моей книги, и я сталкиваюсь с несколькими затяжными головоломками.
Вещи, которые служат в качестве стартовых экранных пусковых установок, похоже, используют комбинацию FLAG_ACTIVITY_NEW_TASK
и FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
, когда они запускают запрошенную активность запуска:
Intent i=new Intent(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
i.setComponent(name);
startActivity(i);
Документация для FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
имеет:
Если установлено, и эта активность либо запускается в новой задаче, либо выводит вверху существующую задачу, она будет запущена в качестве входной двери задачи. Это приведет к применению каких-либо аффинностей, необходимых для выполнения этой задачи в правильном состоянии (либо перемещение активности на нее, либо из нее), либо просто сброс этой задачи в исходное состояние, если это необходимо.
Это не особенно понятно.
В частности, казалось бы, те же эффекты будут видны с использованием комбинации FLAG_ACTIVITY_CLEAR_TOP
и FLAG_ACTIVITY_SINGLE_TOP
. Цитирование документов для FLAG_ACTIVITY_CLEAR_TOP
:
Если установлено, и запущенная деятельность уже запущена в текущей задаче, вместо того, чтобы запускать новый экземпляр этого действия, все остальные действия поверх него будут закрыты, и это намерение будет доставлено в (теперь сверху) старая деятельность как новый намерение...
Текущий исполняемый экземпляр [желаемого действия] получит либо новое намерение, которое вы начинаете здесь, в методе onNewIntent(), либо сам закончите и перезапустите с новым намерением. Если он объявил свой режим запуска "множественным" (по умолчанию), и вы не установили FLAG_ACTIVITY_SINGLE_TOP в одном и том же намерении, он будет завершен и заново создан; для всех других режимов запуска или если установлен FLAG_ACTIVITY_SINGLE_TOP, этот Intent будет доставлен в текущий экземпляр onNewIntent().
Документация FLAG_ACTIVITY_CLEAR_TOP
имеет смысл, по крайней мере для меня.
Итак, что делает FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
, что отличается от комбинации FLAG_ACTIVITY_CLEAR_TOP
и FLAG_ACTIVITY_SINGLE_TOP
?
Бонусные баллы, если вы можете объяснить, что FLAG_ACTIVITY_CLEAR_TASK
отличается от любого из двух других параметров, описанных выше.
Если задано в Intent, переданном Context.startActivity(), этот флаг приведет к тому, что любая существующая задача будет связана с активностью, подлежащей очистке, до начала действия. То есть, деятельность становится новым корнем пустой задачи, и все старые действия завершены. Это можно использовать только совместно с FLAG_ACTIVITY_NEW_TASK.
Одно очевидное различие между этим и FLAG_ACTIVITY_CLEAR_TOP
| FLAG_ACTIVITY_SINGLE_TOP
заключается в том, что FLAG_ACTIVITY_CLEAR_TASK
требуется FLAG_ACTIVITY_NEW_TASK
. Но, кроме этого, казалось бы, что сетевые эффекты одинаковы, а также соответствуют FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
.