如何一起使用FLAG_ACTIVITY_REORDER_TO_FRONT和onBackPressed()

时间:2012-07-27 23:16:20

标签: android android-lifecycle android-hardware

我正在创建一个向导式应用程序,我需要在活动A和B之间保持活动的用户数据。 A有一个Next软键,B有一个Back软按钮。

使用FLAG_ACTIVITY_REORDER_TO_FRONT时,我可以在使用软按钮时保持用户数据存活,因为每个活动都会被重复使用。

但是,当用户从B按下Back硬按钮时,B会死掉,因为该按钮会隐式使用finish()。

然后,我尝试在B中覆盖onBackPressed,添加与我的Back软按钮相同的行为,认为Back hard按钮的行为与前一个按钮完全相同(不完成B)。

现在,用Back硬键从B回到A,一切都很好。此时焦点在A中,当用户再次按下后退硬按钮时,预期的行为是应用程序离开。

问题是,鉴于B还活着,预期行为不会发生;因此,B中的覆盖onBackPressed仍然在监听,而其他一些行为恰好发生了。

如何使用B中的覆盖onBackPressed完成收听,以便当焦点位于A时应用程序离开?

提前致谢。

2 个答案:

答案 0 :(得分:0)

考虑做Krylez的评论。或者您可能想要使用fragments。如果您定位的是早于3.x的SDK,请参阅support library

SDK文件夹中有示例项目,它们使用向导样式。

答案 1 :(得分:0)

好吧,我可以通过自然的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将具有用户输入的数据。

我希望它有所帮助。