Удалить активность из стека в Android
Я хочу удалить активность из стека с помощью кода. Вот мой случай
- Со страницы АИ я собираюсь на страницу Б.
- Со страницы B я должен вернуться на страницу A, используя кнопку возврата.
- На странице BI есть кнопка, которая переходит на страницу C.
- Когда я нажимаю эту кнопку на странице B, я звоню
finish(); //to remove PageB from stack
Хорошо, вот проблема, со страницы C, когда я нажимаю кнопку возврата, я попадаю на страницу A., потому что она в стеке.
Я хочу удалить страницу A из стека, когда нажимаю кнопку на странице B.
Обратите внимание, что я не могу вызвать метод finish() на странице A при вызове страницы B, поскольку хочу вернуться на страницу A. Вернуться можно только в том случае, если нажата кнопка на странице B.
Как я могу сделать это в Android? Спасибо
4 ответа
Вместо того, чтобы звонить startActivity
в A, когда вы начинаете B, позвоните startActivityForResult
, Затем, ваша деятельность для А, справиться onActivityResult
,
Теперь, в B, когда вы открываете C, звоните setResult
перед вызовом финиш. Это позволит вам установить некоторые данные, которые будут переданы обратно onActivityResult
метод. Передайте флаг, чтобы указать, что A должен закрыть себя и затем вызвать finish
, Обрабатывать этот флаг в А onActivityResult
,
Таким образом, каждое действие отвечает за закрытие себя, и вы не искусственно возитесь с задним стеком. Использование флагов намерений прекрасно работает в простом случае A,B,C, но, вероятно, развалится, если эти 3 экрана являются частью более крупного решения (т. Е. A,B и C находятся глубоко под стеком действий, которые вам не нужны возиться с).
Вместо того, чтобы завершить текущее действие, вы можете сразу перейти к другому действию, начав Intent.
Intent intent = new Intent(this, MyTarget.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
Вы можете использовать startActivity(), чтобы снова вызвать A из B.
Конечно, на этой странице есть лучший ответ, но в качестве обходного пути вы можете использовать SharedPreferences, чтобы передать сообщение в Действие A с запросом на его завершение.
Деятельность А:
public class A extends Activity {
public static final String CLOSE_A_ON_RESUME = "CLOSE_A_ON_RESUME";
@Override
public void onResume(){
super.onResume();
//Retrieve the message
SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean IShouldClose=mPrefs.getBoolean(A.CLOSE_A_ON_RESUME,false);
if (IShouldClose){
//remove the message (will always close here otherwise)
mPrefs.edit().remove(A.CLOSE_A_ON_RESUME).commit();
//Terminate A
finish();
}
}
Деятельность C:
public class C extends Activity {
/*
* Stores an application wide private message to request that A closes on resume
* call this in your button click handler
*/
private void finishCthenA(){
//Store the message
SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
mPrefs.edit().putBoolean(A.CLOSE_A_ON_RESUME,true).commit();
//finish C
finish();
}
Обратите внимание, что это несколько рискованно, поскольку настройки сохраняются после перезагрузки, и это может помешать запуску A, если, например, ваше приложение будет убито до возобновления A. Чтобы обойти это, вы также должны удалить сообщение в A.onCreate()