В чем различия между FLAG_ACTIVITY_RESET_TASK_IF_NEEDED и FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP?
Я нахожусь в процессе (наконец) написания главы о задачах для моей книги, и я сталкиваюсь с несколькими затяжными головоломками.
Вещи, которые служат в качестве пусковых установок домашнего экрана, похоже, используют комбинацию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, то это намерение будет доставлено в onNewIntent () текущего экземпляра.
FLAG_ACTIVITY_CLEAR_TOP
Документация имеет смысл, по крайней мере, для меня.
Итак, что жеFLAG_ACTIVITY_RESET_TASK_IF_NEEDED
сделать это отличается от комбинацииFLAG_ACTIVITY_CLEAR_TOP
а такжеFLAG_ACTIVITY_SINGLE_TOP
?
Бонусные баллы, если вы можете объяснить, чтоFLAG_ACTIVITY_CLEAR_TASK
это отличается от любого из двух других вариантов, описанных выше.
Если он установлен в намерении, переданном в 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
.