【问题标题】:Android Activity Back Stack Navigation issueAndroid Activity Back Stack Navigation 问题
【发布时间】:2016-11-20 12:03:42
【问题描述】:

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

场景:

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

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

没什么特别的。

问题

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

Activity B - onCreate() > onPause > onStop > onDestroy

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

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

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

我尝试过的事情

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

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_SINGLE_TOP

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

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

谁能帮忙!

【问题讨论】:

  • Activity A 中的 onBackPressed() 中删除 super.onBackPressed() 以下是 onBackPressed() @Override public void onBackPressed() { moveTaskToBack(true); } 的代码
  • @jatDevta 我不确定这将如何改变任何事情,活动 A 不是问题。其次,我在 Activity A 中有一个导航绘制,将这个 moveTaskToBack(true); 添加到 onBackPressed() 方法只会关闭应用程序,而不是关闭导航抽屉,如果它打开并且我按下返回?

标签: android android-activity android-lifecycle


【解决方案1】:

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

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

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

解决方案

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多