2

我有一个完整的应用程序,除了我最后离开的生命周期。在所有情况下,事情似乎都很好,但有一个:

  • 当我通过按电源按钮暂停应用程序时,它会在恢复时正确暂停并重新启动。
  • 当我旋转屏幕时,它会正确调整大小。
  • 当我暂停然后旋转屏幕时,它的行为不同并且应用程序重置。

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

通过调试,我看到所有三个都这样做(我的想法很相似,我希望是对的):

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

这样对吗?还是我错过了上面第三个示例中的一些生命周期步骤?

谢谢你。

4

3 回答 3

3

请指定应用程序重置的含义。

当您按下电源按钮时,您的应用很可能会停止。这就是为什么您在停止(而不是:暂停)您的应用程序onStart()后看到被调用的原因。

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

更新关于您的评论:您的 Activity 被停止和您的 Activity 被破坏之间存在差异。

轮换是一种配置更改。在这种情况下,您的 Activity 将被销毁并重新创建。如果必须(取决于)通过onRetainNonConfigurationInstance()回调和getLastNonConfigurationInstance()方法,您可以单独处理这种情况。Android按照这个顺序调用onPause(), onStop(), ,onRetainNonConfigurationInstance()然后onDestroy()继续调用onCreate()etc ,同时它不会处理任何事件,这样它们就不会丢失。

最有可能的是,您的某些代码位于错误的回调中,因此在第三种情况下,某些内容没有被初始化/附加/...如果没有代码异常,这真的很难说(如果它是异常)。

我建议您按以下步骤进行。

  • 完成您对生命周期的理解并做到精确(创建、启动、重新启动、恢复、暂停、停止、销毁)
  • 完成您的代码以覆盖其他生命周期回调以及日志消息(不要忘记调用超类的回调)并分析暂停、停止、旋转和组合
  • 确定崩溃点
  • 结合Activity生命周期分析crash涉及的对象的生命周期

当然,或者您可以在此处发布一些代码和异常。

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

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

虽然没有解决您的问题,但它表明必须小心地将代码放在相应的回调中,因为在上述情况下,在重新创建时,仍然不会显示Activity 。

如果您更新您的问题,请给我留言。

于 2013-03-06T09:05:09.457 回答
1

您好,您可以查看有关在 android 中管理 Activity 生命周期的文档。

于 2013-03-06T08:58:32.160 回答
0

当方向改变 Activity 被重新创建。

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

于 2013-03-06T09:00:17.087 回答