【问题标题】:On Back Button shows errror后退按钮显示错误
【发布时间】:2019-08-19 16:20:14
【问题描述】:

我的应用程序有四个活动,Main Activity -> second Activity-> Third Activity -> Fourth Activity。每个 Activity 都包含实现的 onBackPressed 方法。每次调用onBackPressed 方法时,它都会向前一个活动发送一个意图。例如,在Fourth ActivityonBackPressed方法中,它包含了一个意图去前一个Activity,也就是第三个Activity。这在MainActivity 之前工作得很好。当我按下MainActivity 上的后退按钮时,它必须退出应用程序。但是,它只是开始下一个活动,即第二个活动。这个bug是什么原因???

这是一些相关的代码。

从第四个活动开始:

@Override
public void onBackPressed() {
    Intent intent = new Intent(this,third.class);
    intent.putExtra("id",FinalID);
    intent.putExtra("Image Item", categoryItem);
    startActivity(intent);

}

从第三个活动开始:

@Override
public void onBackPressed() {
    Intent intent2 = new Intent(this, second.class);
    intent2.putExtra("Image Item", categoryItem);
    Toast.makeText(this, "theFinalActivity=" + categoryItem.getId(), Toast.LENGTH_SHORT).show();
    startActivity(intent2);
}

第二个活动如下所示。

@Override
public void onBackPressed() {
    next = false;
    Intent intent = new Intent(this, MainActivity.class);
    startActivity(intent);
}

最后是MainActivity中的代码:

@Override
public void onBackPressed() {
    System.exit(0);
}

【问题讨论】:

标签: java android onbackpressed


【解决方案1】:

Android 系统在内部处理活动的回栈。如果您不应该覆盖默认行为,则无需显式处理返回。在您的情况下,在按回时,您不会弹出当前活动,而是将新活动推入后台堆栈。这将导致您的后退按钮的行为不明确。

【讨论】:

  • 能否请您详细说明
【解决方案2】:

首先,onBackPressed 函数只有在您关心活动堆栈时才需要实现(即完成第三个活动将带回第二个活动,完成第二个活动将带出第一个活动一个等等)。活动堆栈已经在处理它。

其次,如果您想将数据从您从调用者打开的活动传递给调用者活动,这不是理想的方式。我想推荐你阅读this documentation,它解释了如何使用 Android 提供的生命周期函数以优雅的方式传递这些意图。

提醒您一下,这里有三个步骤供您在活动之间反向传递数据。

  1. 您需要使用startActivityForResult 而不是startActivity 从第一个活动开始第二个活动,并附带一个请求代码(以便您可以区分不同的请求代码与其他活动,如果有的话)。
  2. 然后在您的第二个活动中,如果您需要将某些内容传递给您的调用者活动(即第一个活动),您需要使用setResult 将所需的数据传递回调用者和finish() 第二个活动。
  3. 在第一个活动中,您需要实现onActivityResult 函数才能从第二个活动中获取数据。

这里是nice example of the overall implementation,你也可以看看。

我知道您期望system.exit(0) 会在任何情况下终止应用程序。但是,在 Android 中,它并没有像我想象的那样工作。我在 StackOverflow 上引用 from this answer 来解释 system.exit(0) 的工作原理。

System.exit(0) - 重新启动应用程序,在 堆。所以,如果你从ActivityASystem.exit(0) 调用ActivityBActivityB 中调用,然后应用程序将被杀死并 立即开始,只有一项活动ActivityA

希望对你有帮助!

【讨论】:

  • 我正在使用自定义的后按方法,因为我需要在按下后退按钮时创建一个新的活动实例。你能说一下为什么在主活动上按下后退按钮会转到第二个活动???
  • 我想,我已经在回答中提到了这一点。请检查我试图解释 system.exit(0) 工作原理的部分。
  • 你能告诉我什么是活动堆栈吗??
  • 当您从另一个Activity 启动Activity 时,android 框架会跟踪堆栈中启动的活动,因此当您从堆栈中pop 时,您会返回上一个活动.要了解更多信息,请参阅developer's documentation here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多