【问题标题】:Android LifecyclesAndroid 生命周期
【发布时间】:2021-09-14 20:37:06
【问题描述】:

(抱歉介绍太冗长了。)

我的程序中有一个“错误”,它会随机进入不应该执行的活动。例如,假设我有活动 AMainActivity)、BC。我从 A 移动到 B,然后从 B 移动到 C。然而,在从 B 移动到 C 时,我注意到它从 BA 然后 A 到C(这对我来说毫无意义;为什么它甚至不“回到”B?)。我无法找出原因,因为我没有任何代码可以从 B 转到 A

这是日志:

A onCreate (from: None) // 刚刚启动程序

一个开始

一份简历

单击活动 A 中的按钮以移动到 B

暂停

B onCreate(来自:A)

B onStart

B onResume

上车

一个 onDestroy

单击活动 B 中的按钮以移动到 C

暂停

A onCreate (from: B) // 为什么?

C onCreate(来自:B)

一个开始

开机

一份简历

C onResume

B onStop

B onDestroy

虽然我相信我不会“同时”进行两项活动,但我认为我是因为 A 被调用。为了验证这一点并看看如果我“同时”移动到两个不同的活动会发生什么,我制作了一个简单的程序,从 BC strong>一个像这样:

startActivity(new Intent(this, B.class));
startActivity(new Intent(this, C.class));

一旦我按下 A 中的一个按钮,这两个就会被调用。我已经为每个活动覆盖了onCreate()onStart()onResume()onPause()onRestart()onRestart()onDestroy(),以放置print 语句以查看它们中的每一个何时被调用。这是我在 Activity B 中按下按钮后的结果(移动到 Acitivity C)。

一个 onCreate

一个开始

一份简历

暂停

点击创建

开机

C onResume

上车

我不明白为什么不调用 B(甚至不调用 onCreate())。是不是因为它立即执行以下命令,甚至没有“足够的时间”来为 B 调用onCreate()?我一直在关注 thisthis(以及 SO 网站)一段时间,但我认为我不理解这种行为。

B 没有被调用有什么原因吗?此外,它从 B 移动到活动 A 然后从 B 移动到 C 的原因可能是什么(提到在“介绍”中)?

编辑:为了清楚起见,我并不想同时运行两个活动。事实上,当我试图转移到活动 C 时,活动 A 无缘无故地被调用(来自“介绍”)。我在想这可能是因为 Activity A 没有被销毁(仍在堆栈上),但我不确定问题是什么。

编辑 2:我试图通过创建一个新程序来提出一个可重现的最小示例,但似乎我没有遇到这种行为,可能是因为我从 DB 中删除了获取数据(也许是因为这个?)。我在下面的 cmets 中简要解释了我在做什么。

【问题讨论】:

  • 这能回答你的问题吗? Switching between activities in android?
  • @SonuSanjeev 正如我在问题中提到的,这是为了看看当我“同时”调用两个活动时它会如何表现。这不是我想要做的。这样做是为了解决我程序中的“错误”。
  • @HenryTwist 这似乎是有道理的,虽然不应该也安排 Activity B (并且 Activity C 安排在 B 之后,这意味着 B 应该在某个时候被调用,因为它在堆栈上)?
  • @AjithkumarMuthukumaran 关于第一个链接,我不想运行ServiceAsyncTask。如果您看到我的“介绍”,您会发现它无缘无故地转到了活动 A(我什至没有从 B 移动到 A 的代码,当然,我没有按后退按钮)。如我的问题所述,第二个链接是我已经查看了一段时间的链接。
  • @Droid 我对它的内部运作一无所知,但 B 开始也没有多大意义。如果在 A 完成之前启动了另一个活动 (C),那么只显示 C 是合乎逻辑的。如果一次只显示一个活动,就没有理由维护一个“堆栈”活动。

标签: android android-intent android-activity android-lifecycle


【解决方案1】:

每行代码都翻了三次,我发现问题是因为我在ActivityC中扩展了ActivityA。我对此没有非常明确的解释,但我会假设扩展活动“创建”一个“实例”。

【讨论】:

  • @HenryTwist 不过感谢您的帮助。
  • 啊,我明白了,很高兴你发现了错误!我看不到您的代码,但在您的C.onCreate 中,您将调用super.onCreate,它指的是A.onCreate。并不是它`创建另一个实例,你只是直接调用方法。
  • 说得通,说得通!再次感谢您。
猜你喜欢
  • 2013-04-06
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 2012-07-22
  • 2013-07-10
  • 2013-01-13
相关资源
最近更新 更多