我已经研究过很多关于Activity back stacks以及Android Developer网站的帖子,但仍然找不到我遇到的问题的解决方案。
情境:
我有Activity A
,我从A导航到Actvity B
,然后按后退按钮再次转到Activity A
:
Actvity A
- > Activity B
- > Actvity A
没什么不寻常的......
问题
当我按后退按钮转到Activity B
- > Activity A
,Activity 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 B
,onStop
等的情况下销毁。表示任何活动清理我在那些回调中的操作没有发生?
我尝试过的事情
在启动onDestroy
时更改各种Intent
过滤器和组合:
Activity B
在FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_SINGLE_TOP
finish()
时调用onBackPressed()
其他各种手指交叉,希望改变,似乎没有任何作用。
任何人都可以帮忙!
答案 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调用服务的最新活动。
就我个人而言,我不知道为什么活动不会在回击时立即被销毁,但这就是为什么会发生这种情况。