В чем различия между 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.

Ответы на вопрос(3)

Ваш ответ на вопрос