Activity.finishAffinity() vs Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK
В Android, если вы хотите очистить текущий стек Activity
и запустить новый Activity
(например, выйти из приложения и запустить журнал Activity
), похоже, есть два подхода.
Есть ли какие-либо преимущества для одного над другим, если ваш целевой уровень API выше 16?
1) Финитировать сродство
Вызов finishAffinity()
из Activity.
Activity.finishAffinity
2) Флаги намерения
Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();
Подход finishAffinity()
подходит для >= API 16.
Подход флагов Intent
подходит для >= API 11.
Чтобы быть ясным, для очистки текущего стека Activity
оба подхода выглядят одинаково одинаково. Мой вопрос в том, есть ли проблемы с тем, что люди испытали и, следовательно, есть ли какие-либо причины выбрать один над другим?
Ответы
Ответ 1
Функционально, нет никакой разницы, но, проверяя это на GenyMotion, кажется, есть небольшая визуальная разница. См. Веб-трансляцию: https://drive.google.com/file/d/0B8Y77sY7Y2CGRS02c3UyNjd2MGs/view?usp=sharing
Вам нужно будет попробовать это на нескольких устройствах, чтобы понять, насколько они совместимы.
Субъективно, я бы сказал, пойти с finishAffinity()
, потому что он более явный. Однако, если вы должны поддерживать < SDK 16 у вас действительно нет выбора.
Ответ 2
Для этого вы должны использовать флаги намерения.
Что делать, если у вас есть большой стек действий, вы будете звонить из каждого, чтобы закончить их все?
Его гораздо лучше и проще просто называть намерение.
Надеюсь, что это поможет.
Ответ 3
Попробуйте это
Intent.FLAG_ACTIVITY_CLEAR_TOP
он очищает стек предыдущих действий.
Ответ 4
Если API >= 21,
вы можете использовать команду:
finishAndRemoveTask();
Завершает все действия в этой задаче и удалит их из списка недавних задач.
https://developer.android.com/reference/android/app/ActivityManager.AppTask.html