11

我有一个活动需要在启动时打开屏幕(以防屏幕关闭)。所以在我的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);

使用这种简单的组合,我可以让我的活动在从我的后台服务启动时显示(是的,这是一个合法的案例)。

然而,问题在于,当我在这种情况下启动我的活动时,会有一个非常奇怪的生命周期行为。使用广泛的日志记录,我发现活动开始后立即发生以下 7 步过程:

  1. 创建
  2. 开始
  3. 恢复
  4. 暂停
  5. 停止
  6. 开始
  7. 恢复

看到了吗?对于简单的活动启动,onStart 会被调用两次。更重要的是,onStop 被神秘地调用了,即使活动刚刚开始 - 并且没有发生任何会导致它停止的事情。

我已经在许多不同的场景中对此进行了测试,似乎这种奇怪的行为只发生在屏幕关闭并且活动在被破坏后启动时才会发生。如果屏幕打开,或者活动已停止 [但尚未销毁],活动将正常启动,并且 onStart 仅调用一次。

底线:似乎当我的活动启动并强制打开屏幕时,Android会启动该活动,然后停止它,然后无缘无故地再次启动它。

那么:为什么会发生这种情况?我能做些什么来解决这个问题(以便在有正当理由之前不会调用 onStop)?


笔记:

  • 有问题的活动正在使用启动singleTask模式
  • 我试过禁用键盘锁/锁,但没有效果
  • 我在运行 Android 3.2 的三星 Galaxy Tab 10.1 上目睹了这种行为。我没有测试这是否适用于其他任何东西......
4

3 回答 3

2

我在这里遇到了类似的问题: Activity Lifecycle X Power Button X Lock Screen

问题是,由于我的活动是强制横向的,当我打开屏幕时,它会以纵向显示锁定屏幕,这会导致配置更改,从而破坏当前的活动。

解决方案是在我的 AndroidManifest.xml 中的 Activity 上添加一个 android:configChanges="orientation"。

于 2012-08-01T16:35:29.000 回答
2

正如@cyberhuman 所建议的那样,在开始活动后立即调用 OnPause 和 OnStop()这个问题的答案为我指明了正确的方向。

我的活动在实际显示给用户之前完成了完整的“虚拟”生命周期的问题是,当活动变得可见时我尝试播放铃声被附加的后续“onStop()”直接静音,并使用标志来使活动在屏幕关闭/屏幕锁定/屏幕打开/活动在后台运行时启动时正常运行是不可能的。

我终于通过覆盖onWindowFocusChanged(boolean hasFocus)方法并从那里启动铃声解决了我的问题。把它放在这里以防有人遇到同样的问题。

于 2017-03-15T08:37:21.903 回答
-2

您可以检查 中的情况onStart,设置静态或全局变量,然后检查变量onStop以覆盖标准行为。

于 2012-05-31T07:17:27.750 回答