2013-03-06 48 views
2

我已经有一个完整的应用程序,除了内存生命周期之外,我留下了最后一个。 事情似乎工作在所有情况下都不错,但一:暂停和旋转时的生命周期

  • 当我按电源按钮的应用程序暂停,它正确地暂停和重启恢复时。
  • 当我旋转它正确调整大小的屏幕。
  • 当我I 暂停然后旋转屏幕,其行为是不同的,应用程序重置。

现在,显然这是我的内部代码的问题,但为了帮助我进行调试,我想了解三个生命周期之间的区别。或者更好,如果第三个例子与前两个例子有些不同。

调试,我看到所有这三个都这样做(我像由心,我希望是正确的):

  • onSaveInstanceState()
  • onPause()
  • onStop()
  • onStart()
  • onResume()

是不是?或者我错过了上面第三个例子中的一些生命周期步骤?

谢谢。

回答

3

请指定您的意思是应用程序重置

当你按下电源按钮时,很有可能你的应用程序停止。这就是为什么你看到onStart()被叫停止(不是:暂停)您的应用程序。

鉴于这种情况,您描述的第三种情况是前两种情况的组合吗?换句话说,您如何在第三种情况下暂停您的应用程序?

更新关于您的评论:还有就是你的活动是停止和你的活动是破坏之间的差异。

旋转是配置更改。在这种情况下,您的Activity将被销毁并重新创建。如果您必须(取决于)onRetainNonConfigurationInstance()回调方法和getLastNonConfigurationInstance()方法,您可以单独处理此案例。安卓呼叫onPause()onStop()onRetainNonConfigurationInstance()和顺序onDestroy(),然后用onCreate()等继续,它将处理任何事件,在此期间,使他们不会迷路。

最有可能的,你的一些代码位于错误的回调,使得在第三场景中,一些没有得到初始化/连接/ ...这是真的很难说没有代码异常(如果它是例外)。

我建议你按以下步骤操作。

  • 完成你的整个生命周期的理解和精确(创建,启动,重启,恢复,暂停,停止,销毁)
  • 完成你的代码覆盖其他生命周期回调以及与日志消息(唐”别忘了调用超类的回调),并分析暂停,停止,旋转和组合
  • 确定坠机
  • 的角度分析在事故involvedd结合活动的生命周期对象的生命周期

或者你可以在这里发布一些代码和例外,当然。

更新2我对AVD进行了测试。我观察到以下内容:

当AVD处于横向方向时,我按下电源按钮,我的应用程序会收到纵向配置更改(大概是因为纵向方向锁定屏幕接管)。再次按下电源并解锁AVD,应用程序会再次收到配置更改,回到横向。

虽然没有解决您的问题,但它表明代码必须仔细放置在相应的回调中,因为在上述情况下,在重新创建时,活动仍不会显示,显示为

如果更新您的问题,请给我评论。

+0

所有的测试都是在模拟器上进行的。在第三次测试中,我按下电源按钮,等待屏幕锁定,旋转屏幕并将其解锁。很显然,这种情况与我只是旋转屏幕或简单地锁定屏幕并将其解锁的​​情况有所不同。 在前两种情况下,我总是发现onStart()是运行的,所以我认为这三项活动都被销毁了。但为什么会有差异? – 2013-03-06 09:13:34

+0

@BeppiMenozzi我已经更新了我的答案。 - 吉兹,我不知道为什么有人低估了它。可能是没有掌握这个主题的人。或者有人点击了错误的箭头。 – 2013-03-06 09:33:46

+0

你的回答并不是绝对值得赞赏的,我投票补偿:)当然是因为这是一个很好的答案。 – 2013-03-06 10:13:06

0

方向更改时重新创建活动。

android:configChanges="keyboardHidden|orientation"添加到清单中的activity

+0

OP说他已经正确管理屏幕旋转。请详细说明你的建议如何在这些情况下改善他的状况。 – 2013-03-06 09:02:54

+0

谢谢。我会试试这个。但是,如果在暂停应用后旋转屏幕,我不明白与在应用运行时旋转屏幕有什么不同。 – 2013-03-06 09:08:55

+1

@BeppiMenozzi请不要试试这个。这是不好的做法。 – 2013-03-06 09:11:57