Удалить активность из стека в Android

Я хочу удалить активность из стека с помощью кода. Вот мой случай

  1. Со страницы АИ я собираюсь на страницу Б.
  2. Со страницы B я должен вернуться на страницу A, используя кнопку возврата.
  3. На странице BI есть кнопка, которая переходит на страницу C.
  4. Когда я нажимаю эту кнопку на странице 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()

Другие вопросы по тегам