Android活动返回堆栈导航问题

时间:2016-11-20 12:03:43

标签: android android-activity android-lifecycle

我已经研究过很多关于Activity back stacks以及Android Developer网站的帖子,但仍然找不到我遇到的问题的解决方案。

情境:

我有Activity A,我从A导航到Actvity B,然后按后退按钮再次转到Activity A

Actvity A - > Activity B - > Actvity A

没什么不寻常的......

问题

当我按后退按钮转到Activity B - > Activity AActivity B不会立即被销毁,正如预期的那样,它会进入暂停状态,这就是我遇到奇怪问题的地方。如果我想从Activity B返回Activity A并且 IF Activity B仍处于暂停状态,则在使用{{1}时会调用其所有生命周期方法来自startActivity(B)

Activity A - Activity B> onCreate()> onPause> onStop< - 为什么会发生这种情况

此时,对我来说它不应再存在了,我无法解释为什么它经历了所有生命周期方法,而不仅仅是启动初始化生命周期方法。从这种奇怪的行为中脱离出来的是,活动仍然可以在屏幕上看到,但不会填充onDestroy,这在初始化时按预期进行。此时,如果我按下RecyclerView再次进入暂停状态。

如果Activity B处于暂停状态(Activity B位于堆栈顶部)并且框架通过生命周期回调结束Activity A,我再次从A导航到Activity B它按预期工作(填充了RecyclerView),基本上一个新的实例总能正常工作。

在提及活动生命周期图时,我可以假设,Activity B进入暂停状态,但是在不调用Activity BonStop等的情况下销毁。表示任何活动清理我在那些回调中的操作没有发生?

我尝试过的事情

在启动onDestroy时更改各种Intent过滤器和组合:

Activity B

FLAG_ACTIVITY_NEW_TASK FLAG_ACTIVITY_CLEAR_TOP FLAG_ACTIVITY_SINGLE_TOP

中调用finish()时调用onBackPressed()

其他各种手指交叉,希望改变,似乎没有任何作用。

任何人都可以帮忙!

1 个答案:

答案 0 :(得分:0)

好的,所以我找到了问题的答案 - 一开始并不明显,但现在我明白了发生了什么。

问题的根本原因是引用相同对象的两个实例(Activity B)引用相同的对象(DI库提供的对象)。

首先从Activity A返回Activity B时,Activity B没有被立即销毁,这会导致复杂化 - 此实例永远不会被重复使用,但是仍然存在一段时间几秒钟。在这种情况下,当使用来自Activity A的startActivity(B)时,它将创建一个新实例并销毁旧实例(因此我看到记录创建和活动结束回调的原因),如果它仍然存在的话。在这种情况下,两个实例共享同一个对象,并且该对象在销毁时“清理”了Activity。因此,旧实例告诉对象(在本例中为Presenter),它应该在活动被销毁时清理它,但事实并非如此,因为已经创建了一个新实例。

解决方案

非常简单,每次创建Activity B的新实例时,都会在Presenter中存储唯一编号(startId),并在Activity B调用onDestroy()时传递其当前唯一编号,并检查它们是否匹配 - 如果它们不匹配它不是最新的实例,那么什么都不做。当您想要停止服务时,非常相似的想法,并检查它从startId调用服务的最新活动。

就我个人而言,我不知道为什么活动不会在回击时立即被销毁,但这就是为什么会发生这种情况。

相关问题