Как использовать FLAG_ACTIVITY_REORDER_TO_FRONT и onBackPressed() вместе
-
13-12-2019 - |
Вопрос
Я создаю приложение в стиле мастера, где мне нужно сохранять пользовательские данные между действиями 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 есть примеры проектов, которые используют стиль мастера.