安卓Activity返回栈导航问题

3

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

场景:

我有一个Activity A,我从A导航到Activity B,然后按返回按钮再次进入Activity A

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

没有什么特别的。

问题

当我按返回按钮从Activity B-->Activity AActivity B并没有立即销毁,而是像预期的那样进入暂停状态,这就是我遇到奇怪问题的地方。如果我想从Activity A返回到Activity BIF Activity B仍处于暂停状态,当我使用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 AonBackPressed() 中删除 super.onBackPressed()。以下是 onBackPressed() 的代码:@Override public void onBackPressed() { moveTaskToBack(true); } - random_user
@jatDevta 我不确定这会改变什么,Activity A并不是问题。其次,在Activity A中我有一个导航抽屉,如果我按下返回键并添加moveTaskToBack(true);onBackPressed()方法中,它只会关闭应用程序,而不是关闭导航抽屉(如果它是打开的)。 - Mark
1个回答

0

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

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

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

解决方案

非常简单,每次创建一个新的Activity B实例时,在Presenter中存储一个唯一的数字(startId),当Activity B调用onDestroy()时传递其当前唯一数字,并检查它们是否匹配-如果不匹配,则不是最新的实例,因此不执行任何操作。当您想要停止服务并检查它是否是从startId开始调用服务的最新活动时,非常类似的想法。

就个人而言,我不知道为什么在按下返回键后Activities不会立即销毁,但这就是发生这种情况的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接