当手机进入休眠状态时,会调用Activity的OnCreate方法。

20
当我按下我的Droid的睡眠按钮时,我的活动的oncreate被调用。为什么会发生这种情况?为什么操作系统希望在设备进入睡眠状态时调用OnCreate?有没有办法停止它,或者至少知道是因为手机进入睡眠状态?

1
你确定你的应用程序不是因为屏幕方向改变而重新启动了吗? - Dave MacLean
不是这样的。它发生在我的手机完全静止放在桌子上时。当我按下睡眠按钮时,会调用onDestroy,然后不知何故会启动一个新的活动。 - iterator
我应该指出,当重新启动时,它会传递给我一个有效的savedInstanceState。 - iterator
4
我错了,实际上这是一个方向改变。通过在我的清单文件中添加android:configChanges="orientation",我不会重新启动活动。谢谢! - iterator
是的,不知道为什么我的手机上,“睡眠”模式始终保持相同的方向,无论设备的物理位置如何,因此在准备进入睡眠状态时,方向变化过程(可能意味着杀死和重新启动)经常会发生。 - Chris Stratton
我想知道如何防止这种情况发生。 - JPM
2个回答

22

这种情况特别发生在被锁定为横屏的活动中,例如在清单文件的活动标签内设置:

android:screenOrientation="portrait"

当你关闭屏幕时,它会读取加速度计以确定真实方向并在关闭前更改屏幕方向。

所以是的,简单的解决方案是添加configChanges,使其看起来像这样:

<activity 
    android:name=".MyActivity"
    android:screenOrientation="landscape"
    android:configChanges="orientation"
/>

你不需要指定screenOrientation,但如果你不这样做,启动时的方向将保持不变,除非你编写代码处理配置更改。

顺便提一下,当我开始在ICS上测试我的应用程序时,我必须处理一些活动开始时的创建/销毁/创建周期中存在的问题。需要一些额外的检查和平衡来使代码更通用。


你有关于ICS上如何运作的更多信息吗?我在运行2.3.3和4.0.4设备时遇到了这个问题。你的解决方案在我的2.3.3设备上有效,但在我的4.0.4设备上睡眠后仍会调用onCreate()方法。 - William Carter
问题可能是设备在锁定屏幕时有一个硬编码的方向。为了测试这个问题,将您的锁定方向设置为相反的方向(很可能是竖屏)。这可能会使额外的onCreate消失,并为您提供一个起点,以找到如何忽略无关的方向更改。 - ProjectJourneyman
8
谢谢。你是对的。我通过将screenSize添加到configChanges中找到了解决方案,像这样:android:configChanges="orientation|screenSize"。从文档中可以看到:“注意:如果您的应用程序目标API级别为13或更高(由minSdkVersion和targetSdkVersion属性声明),则还应该声明“ screenSize”配置,因为在设备在纵向和横向方向之间切换时,它也会发生变化。” - William Carter

10

我遇到了和您一样的问题,我的应用程序(游戏)每当进入休眠状态后都会重新加载。

以下是我解决此问题所采取的步骤:

我添加了

<activity 
     android:configChanges="orientation|screenSize"
/>

希望这能帮助到某人!


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