为什么在我的Activity启动后立即调用onStop?

时间:2012-05-31 07:13:23

标签: android android-activity android-lifecycle

我有一项活动需要在启动时打开屏幕(以防屏幕关闭)。所以在我的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. 的onCreate
  2. 在onStart
  3. 的onResume
  4. 的onPause
  5. 的onStop
  6. 在onStart
  7. 的onResume
  8. 看到了吗?对于简单的活动开始,onStart被调用两次。更重要的是,onStop被神秘地称为,即使活动刚刚开始 - 没有任何事情会导致它停止。

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

    底线:当我的活动启动并且强制启动屏幕时,Android会启动活动,然后停止活动,然后再次启动它,原因无关紧要。

    所以:为什么会这样?我有什么办法可以解决这个问题(所以只有在有正当理由的情况下才会调用onStop)?


    注意:

    • 相关活动正在使用singleTask launchmode
    • 我尝试过禁用键盘锁/锁,但没有效果
    • 我在运行Android 3.2的三星Galaxy Tab 10.1上见证了这种行为。我还没有测试这是否适用于其他任何事情......

3 个答案:

答案 0 :(得分:2)

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

问题在于,由于我的活动被迫横向显示,当我打开屏幕时,它显示了纵向锁屏,导致配置发生变化,从而破坏了当前的活动。

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

答案 1 :(得分:2)

根据@cyberhuman的建议,这个问题OnPause and OnStop() called immediately after starting activity的答案向我指出了正确的方向。

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

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

答案 2 :(得分:-2)

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