gpt4 book ai didi

Android Activity 返回堆栈导航问题

转载 作者:太空狗 更新时间:2023-10-29 14:45:36 24 4
gpt4 key购买 nike

我研究了很多关于 Activity 返回堆栈的帖子以及 Android 开发者网站,但仍然找不到解决我遇到的问题的方法。

场景:

我有 Activity A,我从 A 导航到 Activity B,然后按返回按钮再次转到 Activity A:

Activity A --> Activity B --> Activity A

没什么特别的..

问题

当我按下后退按钮从 Activity B 转到 --> ActivityA 时,ActivityB 不会立即被销毁,正如预期的那样,它进入暂停状态,这是我遇到奇怪问题的地方。如果我想从Activity A返回到Activity B并且IFActivity B还处于暂停状态all当使用 ActivityA 中的 startActivity(B) 时,它的生命周期方法被调用:

Activity B - onCreate() > onPause > onStop > onDestroy <-- 为什么会这样

在这一点上,对我来说它不应该再存在了,我无法解释为什么它经历了所有的生命周期方法,而不仅仅是开始初始化生命周期方法。这种奇怪行为的结果是,Activity 在屏幕上仍然可见,但不会填充 RecyclerView,这在第一次初始化时是按预期进行的。此时如果我按回 Activity B 再次进入暂停状态。

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

当提到 Activity 生命周期图时,我所能假设的是 Activity B 进入暂停状态,但是在没有调用 onStoponDestroy 的情况下被销毁 等。这意味着我在这些回调中进行的任何 Activity 清理操作都没有发生?

我尝试过的事情

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

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_SINGLE_TOP

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

其他各种祈祷和希望改变,似乎没有任何效果。

谁能帮帮我!

最佳答案

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

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

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

解决方案

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

我个人不知道为什么 Activity 没有在按下时立即销毁,但这就是发生这种情况的原因。

关于Android Activity 返回堆栈导航问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40703799/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com