我有一个 Activity 需要在启动时打开屏幕(以防屏幕关闭)。所以在我的 onCreate
中,我有:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
|WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
|WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
|WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
使用这种简单的组合,我能够使我的 Activity 在从我的后台服务启动时显示(是的,这是一个合法的案例)。
然而,问题在于,在这种情况下,当我启动我的 Activity 时,会出现非常奇怪的生命周期行为。使用大量日志记录,我能够确定以下 7 步过程在 Activity 开始后立即发生:
- onCreate
- 开始
- onResume
- 暂停
- 停止
- 开始
- onResume
看到了吗?对于一个简单的 Activity 启动,onStart 被调用两次。更重要的是,onStop 被神秘地调用了,即使 Activity 刚刚开始 - 并且没有发生任何会导致它停止的事情。
我已经在许多不同的场景中对此进行了测试,似乎这种奇怪的行为只发生在屏幕关闭并且 Activity 在它被销毁后启动时。如果屏幕打开,或者如果 Activity 已停止 [但尚未销毁],Activity 将正常启动,并且仅调用一次 onStart。
底线:当我的 Activity 启动并强制打开屏幕时,Android 会启动 Activity,然后停止它,然后无缘无故地再次启动它。
那么:为什么会这样?我能做些什么来解决这个问题(这样只有在有正当理由的情况下才会调用 onStop 吗)?
注意事项:
- 相关 Activity 正在使用
singleTask
启动模式 - 我试过禁用键盘保护/锁,但没有效果
- 我在运行 Android 3.2 的 Samsung Galaxy Tab 10.1 上看到了这种行为。我还没有测试这是否适用于其他任何东西......
最佳答案
我在这里遇到了类似的问题: Activity Lifecycle X Power Button X Lock Screen
问题是,由于我的 Activity 是强制横向的,当我打开屏幕时,它以纵向显示锁定屏幕,这导致配置更改,从而破坏了当前的 Activity。
解决方案是在我的 AndroidManifest.xml 中的 Activity 上添加一个 android:configChanges="orientation"。
关于android - 为什么在我的 Activity 启动后立即调用 onStop?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10829005/