Como usar FLAG_ACTIVITY_REORDER_TO_FRONT e onBackPressed() juntos
-
13-12-2019 - |
Pergunta
Estou criando uma aplicação estilo Wizard, onde preciso manter vivos os dados do usuário entre as atividades A e B.A tem um botão virtual Próximo e B tem um botão virtual Voltar.
Ao usar FLAG_ACTIVITY_REORDER_TO_FRONT
Posso manter os dados do usuário ativos quando os botões virtuais são usados, porque cada atividade é reutilizada.
Mas, quando o usuário pressiona o botão Voltar de B, B morre, devido a esse botão físico usar finish() implicitamente.
Então, tentei substituir onBackPressed
em B, adicionando a ele o mesmo comportamento do botão Voltar, pensando que o botão Voltar se comportará exatamente como o botão anterior (não terminar B).
Agora, voltando de B para A com a tecla Voltar, está tudo bem.Neste ponto com o foco em A, quando o usuário pressiona novamente o botão físico Voltar, o comportamento esperado é que a aplicação saia.
O problema é que o comportamento esperado não ocorre, visto que B ainda está vivo;então isso é substituído onBackPressed
em B ainda está ouvindo e, em vez disso, ocorre algum outro comportamento.
Como posso terminar de ouvir com o override onBackPressed
em B, para que quando o foco estiver em A a aplicação saia?
Desde já, obrigado.
Solução 2
Bem, eu poderia resolver meu problema com uma solução Android natural:
Seguindo a dica do Krylez, parei de usar FLAG_ACTIVITY_REORDER_TO_FRONT, para não ter mais conflitos com o hard button, e agora estou reciclando o Intent que inicia meu assistente.
Em A, tenho um método muito comum que é chamado quando o usuário pressiona o botão continuar para ir para B.A atividade A é apenas informativa, portanto não precisa colocar extras do Intent com os dados do usuário ao ir para B, assim:
/** Called when the user presses the Continue button*/
public void continueButtonOnClick(View view) {
Intent intent = this.getIntent();
intent.setClass(this, StepOneRegisterWizardActivity.class);
startActivity(intent);
}
Ao iniciar a atividade B, ela deve sempre buscar se há dados do usuário disponíveis nos extras do Intent, assim:
@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"));
}
}
Agora, talvez de B, o usuário pressione qualquer botão Voltar disponível (suave ou forte) para voltar a A.Neste caso, precisamos colocar os dados do usuário nos extras do Intent, assim:
/** 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);
}
Finalmente, quando o usuário pressionar o botão continuar novamente, a nova Atividade B terá os dados que o usuário inseriu da última vez.
Eu espero que isso ajude alguém.
Outras dicas
Considere fazer o comentário de Krylez.Ou você pode querer usar fragmentos.Se você segmentar SDKs anteriores à versão 3.x, consulte biblioteca de suporte.
Existem projetos de exemplo dentro da pasta SDK, que usam o estilo do assistente.