如何从backstack中删除旧活动? (真实的方式)

时间:2014-12-09 22:14:53

标签: android android-lifecycle

我是Android开发的新手,这是我的问题:
我有2个活动:A和B. 从A,我通过startActivity(new Intent(A.this, B.class))打电话给B. 从B开始,我做了一些事情并以同样的方式回到A:startActivity(new Intent(B.this, A.class))
然而,当我在新A上时,按下"返回"按钮,首先我看到B类,然后是A类的旧版(未更改版本)。

我尝试在finish();方法中放置onPause()。但是,我的活动在方向更改时崩溃了。
如何正确控制活动后台堆叠?提前谢谢。

4 个答案:

答案 0 :(得分:1)

听起来好像不是打电话给startActivity以回到A,而是可以打电话给finish() ;.这将使您回到之前的Activity

如果您使用FLAG_ACTIVITY_CLEAR_TOP

,也可以完成同样的操作
Intent intent = new Intent(B.this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent); 

关于接受的答案建议使用FLAG_ACTIVITY_REORDER_TO_FRONT - 对于您的情况,它确实无关紧要。但是在略有不同的情况下,你有A-> B-> C并且你使用REORDER返回A,你实际上最终会得到一个看起来像B-> C->的堆栈。一个。使用CLEAR_TOP,您最终只得到A.点是,REORDER意味着REORDERCLEAR_TOP应该弹出后台。在你的简单情况下,他们碰巧也会做同样的事情,但在我看来,按照他们的意图使用旗帜是更好的做法。

答案 1 :(得分:0)

要么StartActivityForResult要么考虑使用片段。如果你需要在活动之间跳转,想想你为什么要这样做?如果您在两者之间传递信息,那么有几个选项。片段为您提供了选项,您可以将数据保存在托管片段的Activity上,或者您可以让Singleton生活在您将扩展的Application类中。

答案 2 :(得分:0)

了解活动生命周期 - here。你必须实现保存实例。

答案 3 :(得分:0)

当您在没有任何其他标志的情况下调用startActivity时,您将创建指定的Activity的新实例。这意味着你的后台最终看起来像这样:

A -> B -> A(2)

您有两种选择:

第一个选项,您可以在Intent上添加标志,指示它将A重新排序到前端(如果它已经存在于后端堆栈中)。注意,这不会关闭B;之后你必须在B中拨打finish()

Intent intent = new Intent(B.this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startAcvitiy(intent);
finish();

第二个选项是在A中使用startActivityForResult而不是startActivity,让活动B将结果传回给A.我认为这更清晰,它为您提供了一种非常简单的方法来回应B完成时发生的事情(例如,您可以更新您的UI)。请参阅Android开发者网站的this guide