我有一项活动需要在启动时打开屏幕(以防屏幕关闭)。所以在我的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个步骤:
看到了吗?对于简单的活动开始,onStart被调用两次。更重要的是,onStop被神秘地称为,即使活动刚刚开始 - 没有任何事情会导致它停止。
我已经在许多不同的场景中对此进行了测试,看起来这种奇怪的行为只发生在屏幕关闭且活动在销毁后启动时。如果屏幕打开,或者活动已停止[但尚未销毁],则活动正常启动,onStart仅调用一次。
底线:当我的活动启动并且强制启动屏幕时,Android会启动活动,然后停止活动,然后再次启动它,原因无关紧要。
所以:为什么会这样?我有什么办法可以解决这个问题(所以只有在有正当理由的情况下才会调用onStop)?
注意:
singleTask
launchmode 答案 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
中的变量以覆盖标准行为。