【问题标题】:How to make an activity stop, rather then be destroyed, from the BACK key?如何通过 BACK 键使活动停止而不是被销毁?
【发布时间】:2016-03-04 14:58:52
【问题描述】:

现在,当按下 BACK 键时,活动会被破坏。我怎样才能让它停止(即保持所有变量等活动),而不是被销毁?

谢谢!

【问题讨论】:

  • 类似,但是当按下返回键时它运行主要活动。我只需要停止(即暂停并移至后台,从而返回上一个活动)。
  • 什么/多少变量?它们是如何被使用的?您可能会考虑将它们设置为类变量,而不是担心保持该活动处于活动状态。
  • 在这里查看我的答案.. stackoverflow.com/questions/5914040/…

标签: android


【解决方案1】:

为什么需要让变量保持活动状态?鉴于 Android 应用程序的既定生命周期,我不确定“只是为了保留变量”而防止 Activity 被销毁是否有意义。

  1. 即使您在不销毁应用程序的情况下停止应用程序,Android 也总有可能将其杀死以释放内存。无论如何,您都必须在代码中考虑到这一点,因此防止应用程序被破坏并不能让您免于编写代码。

  2. 在 onPause() 和 onResume() 方法中使用 SharedPreferences 可以相对轻松快速地保存和恢复变量。除非您要存储大量数据,否则防止应用程序被破坏可能不会有太大的不同。

  3. 听起来您想将变量保留在内存中,因为您打算返回此活动。通常,您不会使用后退按钮来离开您打算返回的活动。相反,您将创建一个 Intent 并开始一个新活动。当您执行此操作时,Android 会将当前活动放在调用 onPause() 和 onStop() 的 Back Stack 上,这似乎正是您正在寻找的那种行为。

因此,如果您仍然真的想防止您的活动被破坏(至少在 Android 决定它使用太多内存并自行杀死它之前),您可以随时使用 Sagar 的代码并在 onBackPressed() 中启动一个新活动。

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

只要确定那是你真正想做的事。

【讨论】:

  • 谢谢,工作......只是一个细节,我应该如何让它知道哪个活动启动了这个活动,以便它知道返回到哪个?
  • 如果你只是想返回上一个activity,那为什么返回按钮的正常功能不能接受呢?您可以通过在 Intent 中包含有关第一个活动的信息来确定第一个活动,该 Intent 用于使用 intent.putExtra("activity_name", "activity_1") 启动第二个活动,然后在第二个活动中检索该名称。但是,除非您在活动中做一些非常不寻常的事情,否则通过在 onPause() 和 onResume() 中正确保存数据而不覆盖 onBackPressed() 会更好地满足您的兴趣。
  • 对于计时器应用程序,您希望后键充当主页键的一个原因。
  • 将计时器应用程序的逻辑放在 Activity 中(并覆盖后退按钮的功能)几乎可以肯定是不正确的。播放音乐或设置计时器等长时间运行的任务应该发生在 Service 中,它们将在 Activity 生命周期之外。
【解决方案2】:

简单的一行

@Override
public void onBackPressed() {
    mActivity.moveTaskToBack(true);
}

【讨论】:

    【解决方案3】:

    按下BACK键会触发Activity类的onBackPressed回调方法。此回调的默认实现调用finish() 方法。

    http://developer.android.com/reference/android/app/Activity.html#onBackPressed()

    您可以重写此方法以将活动移至后台(模仿按 HOME 键的动作。

    例如:

    
    @Override
    public void onBackPressed() {
        onKeyDown(KeyEvent.KEYCODE_HOME);        
    }
    

    你也可以考虑这里提到的moveTaskToBackground():

    Override back button to act like home button

    【讨论】:

    • 不,不,只需要停止一项活动,而不是整个应用程序。 :)
    • 我相信如果你停止一个活动,你会失去它的上下文和所有的局部变量。这捍卫了你想要达到的目的。如果我错了,请纠正我。
    • 不是真的,如果我覆盖后退按钮以充当主页按钮,当我再次启动应用程序时,内容仍然存在。问题是它会停止整个应用程序,而我只需要停止一项活动。 :)
    【解决方案4】:

    我已经设法准确地计算出您想要的内容: 使用后退按钮在 2 个活动之间切换并保持它们全部 不会被破坏!

    例如:您有 2 个活动 A 和 B。A 将首先启动,然后 A 调用 B。当 B 加载时,用户按返回按钮并从 B 切换回活动 A。从现在 B 不应该被破坏然后进入后台,当用户再次从 A 启动活动 B 时,活动 B 将被带到前台,而不是再次重新创建或创建新实例!

    如何实现:

    1.覆盖activity B的onBackPressed():

    @Override
    public void onBackPressed() {
        Intent backIntent = new Intent(this, ActivityA.class);
        backIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        startActivity(backIntent);
    }
    

    2。在活动 A 上,调用活动 B:

    public void callActivityB() {
        Intent toBintent = new Intent(this, ActivityB.class);
        toBIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        startActivity(toBintent);
    }
    

    记得在调用 A&B 时添加标志:Intent.FLAG_ACTIVITY_REORDER_TO_FRONT。

    【讨论】:

    • 感谢这个想法。至少它更接近所问问题的真正答案,而不是所有那些“你为什么需要这个”的建议。虽然如果你从 B 返回到 A 然后再次按下它可能需要更多的调整,就像我的情况一样,它会给出异常堆栈跟踪并再次显示活动 B。也许应该找到另一个可以提供帮助的 Intent 标志。
    【解决方案5】:

    这类似于之前询问的this question。

    希望这会有所帮助! NS

    【讨论】:

    • 关闭,但“moveTaskToBack(true);”停止整个应用程序(即充当“主页”按钮),而我只需要停止一项活动。
    【解决方案6】:

    首先,很抱歉没有回答这个问题,因为我仍然没有最佳答案。 但是,我真的很喜欢人们开始问“你需要这个做什么”。而且,很少有人问这个问题的人,真的值得这样的问题。我认为这次不会,但是好吧,这不是问题...

    无论如何,我会尝试指出为什么我们中的一些人相信

    从活动 A 转到活动 B(基于一些数据获取创建 UI)和

    从 B 回到 A(销毁所有创建的 UI 和/或在 B 中获取的数据)有时是一个糟糕的概念。更好的解决方案是保持堆栈不变,因此在 Activity B 中使用类似 finish() 的东西,但将 Activity B 保持在 Pause 状态,所以稍后从 Activity A 再次调用它时 - 它只是进入 onResume = 没有重新创建在 UI 中,没有额外的数据获取。好处当然是快速且响应迅速的 UI,如果您有更复杂的 UI 布局,则真正的区别在于。

    【讨论】:

      【解决方案7】:

      只需在活动清单中指定为

       android:persistent="true"
      

      这应该可以防止您的活动被破坏。要了解更多信息,请参阅以下由我回答的链接

      How to prevent call of onDestroy() after onPause()?

      Prevent activity from being destroyed as long as possible

      在上面的帖子中我已经用一个用例详细解释了

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多