Почему FLAG_ACTIVITY_CLEAR_TOP не работает?
Как говорится в заголовке: Почему intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
или intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
не будут работать?
У меня есть 3 действия, скажем, A, B и C.
Когда я пытаюсь запустить Activity A с C с кодом:
Intent i = new Intent(this, A.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
Он просто запускает Activity A, но не очищает верхнюю часть.! -_-
Я также попытался использовать setFlags()
.
Я прочитал разные вопросы по поводу этой проблемы, но я не смог найти правильный ответ. > _ & Л;
Кто-нибудь, пожалуйста, помогите!
Edit
Код для onBackPressed() в действии "A" по запросу @codeMagic.
@Override
public void onBackPressed(){
if(wvLogin.canGoBack())
wvLogin.goBack();
else
super.onBackPressed();
}
Ответы
Ответ 1
Из документации для FLAG_ACTIVITY_CLEAR_TOP:
Если установлено, и запущенная деятельность уже запущена в текущую задачу, вместо этого вместо запуска нового экземпляра этого деятельность, все другие мероприятия поверх нее будут закрыты и это намерение будет передано (сейчас сверху) старой деятельности как новое намерение.
Как вы добавили в свой комментарий, действие A было закончено до вызова B, поэтому эта ситуация не применяется. Вместо этого будет запущен новый экземпляр активности A.
Как я вижу, у вас есть два варианта:
1) Используйте флаги Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK
. Это запустит активность A как корень стека. Он работает, но любые другие действия в стеке будут потеряны. Предполагая, что A было первым действием (или, по крайней мере, что вас не интересуют какие-либо предыдущие действия в стеке задач), это не имеет значения. Примечание. Для CLEAR_TASK требуется уровень API 11.
2) Еще одно возможное решение (в случае, если предыдущее предположение неверно) заключалось бы в том, чтобы не использовать флаги намерения вообще:
- B запускает C с
startActivityForResult()
.
- Вместо вызова A, C заканчивается, установив результат для B, указывающий, что A должен быть запущен.
- В
B.afterActivityResult()
завершите B и запустите A.
Ответ 2
Вам не хватает флага Intent.FLAG_ACTIVITY_SINGLE_TOP
Попробуйте следующее:
Intent i = new Intent(this, A.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i);
Ответ 3
Вы использовали различный смысл: используйте тот, который вы инициализировали:
Intent i = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); \\WRONG;;
startActivity(i);
Решение:
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); \\RIGHT;;
Вы можете либо поставить noHistory true для Activity A в манифесте
android:noHistory=true