Android 如何使活动停止,而不是被销毁,从后退键?

Android 如何使活动停止,而不是被销毁,从后退键?,android,Android,现在,当按下后退键时,活动将被销毁。我如何使它停止(即保持所有变量等处于活动状态),而不是被销毁 谢谢 这与前面的问题类似 希望这有帮助! 注意按后退键触发活动类的onBackPressed回调方法。此回调的默认实现调用finish()方法 您可以替代此方法将活动移动到背景(模拟按HOME键的操作) 例如: 您还可以考虑这里提到的 MOVETASKTROBACKE()/: 为什么需要保持变量的活性?考虑到Android应用程序的既定生命周期,我不确定“仅仅为了保持变量”而防止活动被破坏是否有意

现在,当按下后退键时,活动将被销毁。我如何使它停止(即保持所有变量等处于活动状态),而不是被销毁

谢谢

这与前面的问题类似

希望这有帮助!
注意

按后退键触发
活动
类的
onBackPressed
回调方法。此回调的默认实现调用
finish()
方法

您可以替代此方法将活动移动到背景(模拟按HOME键的操作)

例如:

您还可以考虑这里提到的<代码> MOVETASKTROBACKE()/<代码>:


为什么需要保持变量的活性?考虑到Android应用程序的既定生命周期,我不确定“仅仅为了保持变量”而防止活动被破坏是否有意义

  • 即使你在不破坏应用程序的情况下停止应用程序,Android也有可能会为了释放内存而杀死它。无论如何,你必须在你的代码中说明这一点,因此阻止应用程序破坏不会让你免于编写代码

  • 使用onPause()和onResume()方法中的SharedReference,可以相对轻松快速地保存和还原变量。除非存储大量数据,否则防止应用程序破坏可能不会有太大影响

  • 听起来您希望将变量保留在内存中,因为您打算返回此活动。通常情况下,您不会使用“后退”按钮离开您打算返回的活动。相反,您会创建一个意图并启动一个新活动。当您这样做时,安卓会将当前活动放在后面ack调用onPause()和onStop(),这似乎正是您要寻找的行为

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


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

    无论如何,我将试图指出为什么我们中的一些人相信这一点

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

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

    简单的一行

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

    我已经成功地解决了您想要的问题:使用“后退”按钮在两个活动之间切换,并保持它们不被破坏!

    例如:您有两个活动A和B。A将首先启动,然后A调用B。当B加载时,用户按“后退”按钮并从B切换回活动A。从现在起,B不应被销毁,而应转到后台,当用户再次从A启动活动B时,活动B将被带到前台,而不是重新创建n或创建了新实例!

    如何实现:
    1.重写活动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时将flag:Intent.flag\u ACTIVITY\u REORDER\u添加到\u FRONT。

    只需在活动清单中指定为

     android:persistent="true"
    
    这应该可以防止你的活动被破坏。要了解更多信息,请参考我回复的以下链接


    在上面的帖子中,我已经用一个类似的用例详细解释了,但是当按下后退键时,它会运行主活动。我只需要停止(即暂停并移动到后台,从而返回到以前的活动)什么/多少个变量?它们是如何被使用的?你可以考虑将它们设置为类变量,而不用担心保持这个活动。看看我的答案……但是,“MOVETASKToBeBuSE(true);”停止整个应用程序(即作为“家”按钮)。,而我只需要停止一个活动。不,不,只需要停止一个活动,而不是整个应用程序。:)我相信如果停止一个活动,就会失去它的上下文和所有局部变量。这就是你想要达到的目的。如果我错了,请纠正我。不是真的,如果我覆盖“后退”按钮,使其像“主页”按钮一样工作,当我再次启动应用程序时,内容仍然存在。问题是它会停止整个应用程序,而我只需要停止一个活动。:)谢谢,工作。。。只有一个细节,我应该如何让它知道是哪个活动启动了此活动,以便它知道返回到哪个活动?如果您只想返回到上一个活动,那么为什么“后退”按钮的正常功能不可接受?您可以通过将第一个活动的相关信息包含在用于使用Intent.putExtra(“活动名称”、“活动1”)启动第二个活动的Intent中,然后在第二个活动中检索该名称来确定第一个活动。但是,除非您在活动中做了一些非常不寻常的事情,否则将数据正确地保存在onPause()和onResume()中,而不重写
    public void callActivityB() {
        Intent toBintent = new Intent(this, ActivityB.class);
        toBIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        startActivity(toBintent);
    }
    
     android:persistent="true"