Как использовать FLAG_ACTIVITY_REORDER_TO_FRONT и onBackPressed() вместе

StackOverflow https://stackoverflow.com//questions/11696798

Вопрос

Я создаю приложение в стиле мастера, где мне нужно сохранять пользовательские данные между действиями A и B живыми.У A есть программная кнопка "Далее", а у B есть программная кнопка "Назад".

При использовании FLAG_ACTIVITY_REORDER_TO_FRONT Я могу сохранять пользовательские данные в актуальном состоянии при использовании программных кнопок, потому что каждое действие используется повторно.

Но, когда пользователь нажимает жесткую кнопку возврата из B, B умирает, из-за того, что жесткая кнопка использует finish() неявно.

Затем я попробовал переопределить onBackPressed в B, добавив к нему то же поведение, что и к моей программной кнопке "Назад", думая, что жесткая кнопка "Назад" будет вести себя точно так же, как предыдущая кнопка (не завершать B).

Теперь, возвращаясь из B в A с помощью Back hard key, все в порядке.На этом этапе с фокусом в A, когда пользователь снова нажимает жесткую кнопку возврата, ожидаемое поведение заключается в том, что приложение закрывается.

Проблема в том, что ожидаемое поведение не происходит, учитывая, что B все еще жив;так что это переопределяет onBackPressed в B все еще прослушивается, и вместо этого происходит какое-то другое поведение.

Как я могу закончить прослушивание с переопределенным onBackPressed в B, так что, когда фокус находится в A, приложение удаляется?

Заранее спасибо.

Это было полезно?

Решение 2

Что ж, я мог бы решить свою проблему с помощью естественного решения для Android:

Следуя совету Krylez, я перестал использовать FLAG_ACTIVITY_REORDER_TO_FRONT, поэтому у меня больше нет конфликтов с жесткой кнопкой, и теперь я перерабатываю Intent, который запускает мой мастер.

В A у меня есть очень распространенный метод, который вызывается, когда пользователь нажимает программную кнопку продолжить, чтобы перейти к B.Действие A просто информативно, поэтому ему не нужно добавлять дополнительные данные Intent к данным пользователя при переходе к B, например, так:

    /** Called when the user presses the Continue button*/
public void continueButtonOnClick(View view) {

        Intent intent = this.getIntent();
        intent.setClass(this, StepOneRegisterWizardActivity.class);
        startActivity(intent);
}

Когда запускается действие B, оно всегда должно искать, доступны ли данные пользователя в дополнениях Intent, например, так:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_step_one_register_wizard);

    // Get the components of the content layout
    usernameEditText = (EditText)findViewById(R.id.usernameEditText);
    passwordEditText = (EditText)findViewById(R.id.passwordEditText);

    getIntentExtras();
}

private void getIntentExtras() {
    Intent intent = this.getIntent();

    Bundle bundle = intent.getExtras();
    if (bundle != null) {
        usernameEditText.setText(bundle.getCharSequence("usernameEditText"));
        passwordEditText.setText(bundle.getCharSequence("passwordEditText"));
    }
}

Теперь, возможно, начиная с B, пользователь нажимает любую доступную кнопку возврата (мягкую или жесткую), чтобы вернуться к A.В этом случае нам нужно поместить данные пользователя в дополнительные функции Intent, например, следующим образом:

    /** Called when the user presses the Back soft button*/
public void backButtonOnClick(View view) {
    onBackPressed();
}

@Override
/** Called when the user presses the Back hard button*/
public void onBackPressed() {
    finish();

    Intent intent = this.getIntent();
    intent.setClass(this, StepZeroRegisterWizardActivity.class);
    intent.putExtra("usernameEditText", usernameEditText.getText());
    intent.putExtra("passwordEditText", passwordEditText.getText());
    startActivity(intent);
}

Наконец, когда пользователь снова нажмет программную кнопку продолжить, новое действие B будет содержать данные, которые пользователь ввел в прошлый раз.

Я надеюсь, это кому-нибудь поможет.

Другие советы

Подумайте о том, чтобы поступить так, как прокомментировал Крайлез.Или вы, возможно, захотите использовать фрагменты.Если вы нацелены на SDK, которые старше 3.x, смотрите библиотека поддержки.

В папке SDK есть примеры проектов, которые используют стиль мастера.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top