さて、自然な Android ソリューションで問題を解決できました。
Krylez のヒントに従って、FLAG_ACTIVITY_REORDER_TO_FRONT の使用をやめたので、ハード ボタンとの競合がなくなりました。今は、ウィザードを開始するインテントをリサイクルしています。
A には、ユーザーが [続行] ソフト ボタンを押して 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 が開始されると、次のように、インテントのエクストラで利用可能なユーザーのデータがあるかどうかを常に確認する必要があります。
@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 にはユーザーが最後に入力したデータが含まれます。
誰かの役に立てば幸いです。