Удалить активность из стека в Android - PullRequest
4 голосов
/ 16 сентября 2011

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

  1. Со страницы AI я собираюсь на страницу B.
  2. Со страницы B я долженвернуться на страницу A с помощью кнопки возврата.
  3. На странице BI есть кнопка, которая переходит на страницу C.
  4. Когда я нажимаю эту кнопку на странице B, я звоню
finish(); //to remove PageB from stack

Хорошо, вот проблема. Со страницы C, когда я нажимаю кнопку возврата, меня перенаправляют на страницу A., потому что она в стеке.

Я хочу удалить страницу A из стека, когда нажимаю кнопку на странице B.

Обратите внимание, что при вызове я не могу вызвать финиш () на странице AСтраница B, потому что я хочу вернуться на страницу A. Единственный случай, когда я не хочу возвращаться, это когда кнопка на странице B. нажата.

Как я могу сделать это в Android?Спасибо

Ответы [ 4 ]

5 голосов
/ 16 сентября 2011

Вместо того, чтобы звонить startActivity в A при запуске B, звоните startActivityForResult. Затем, ваша деятельность для A, обрабатывать onActivityResult.

Теперь, в B, когда вы открываете C, звоните setResult, прежде чем вызывать финиш. Это позволит вам установить некоторые данные, которые будут переданы обратно в метод A onActivityResult. Передайте флаг, чтобы указать, что A должен закрыть себя и затем вызвать finish. Обрабатывать этот флаг в A 1015 *.

Таким образом, каждое действие отвечает за закрытие себя, и вы не искусственно возитесь с задним стеком. Использование флагов намерений прекрасно работает в простом случае A, B, C, но, вероятно, развалится, если эти 3 экрана являются частью более крупного решения (т. Е. A, B и C находятся под множеством действий, которые вы не хотите возиться с).

4 голосов
/ 16 сентября 2011

Вместо того, чтобы завершить текущее действие, вы можете перейти непосредственно к другому действию, начав Intent.

Intent intent = new Intent(this, MyTarget.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
0 голосов
/ 16 сентября 2011

Конечно, есть лучший ответ на этой странице , но в качестве обходного пути вы можете использовать SharedPreferences для передачи сообщения в действие A с запросом на его завершение.

Деятельность 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 ()

0 голосов
/ 16 сентября 2011

Вы можете использовать startActivity () для повторного вызова A из B.

...