如何防止在关闭屏幕时重新创建活动?
我所做的
- 启动Bejewels并前往珠宝屏幕.
- 短按电源按钮.屏幕已关闭,但设备未关闭.
- 再次按电源按钮.
我所看到的
与关闭屏幕前相同的屏幕.
对于我的应用程序(简单的一个,只是一个带有单个WebView的Web应用程序),方案如下:
我所做的
- 启动我的应用.onCreate()方法活动将URL加载到WebView中.
- 短按电源按钮.屏幕已关闭,但设备未关闭.
- 再次按电源按钮.
我所看到的
WebView正在重新加载页面.
我的期望
在Bejewels的情况下,我希望看到相同的屏幕,我的应用程序是以前状态的页面:脚本正在运行,表单字段已填充等.
调试显示,我错了(在前一个问题中)并且onDestroy()和onCreate()在屏幕刚刚打开时被逐个调用.由于我仍然听到由脚本播放的音乐,当屏幕关闭时,看起来活动和WebView都存在,直到我再次按下电源按钮.
我尝试了什么.
lifecycle lifetime android-intent activity-lifecycle android-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);
Run Code Online (Sandbox Code Playgroud)
使用这种直接的组合,我能够在我的后台服务启动时显示我的活动(是的,这是一个合法的案例).
然而,问题是当我在这种情况下启动我的活动时,存在一种非常奇怪的生命周期行为.使用广泛的日志记录,我能够确定在活动开始后立即发生以下7个步骤:
看到了吗?对于简单的活动开始,onStart被调用两次.更重要的是,onStop被神秘地称为,即使活动刚刚开始 - 没有任何事情会导致它停止.
我已经在许多不同的场景中对此进行了测试,看起来这种奇怪的行为只发生在屏幕关闭且活动在被破坏后启动时.如果屏幕打开,或者活动已停止[但尚未销毁],则活动正常启动,onStart仅调用一次.
结论:似乎当我的活动启动并且强制启动屏幕时,Android会启动活动,然后停止活动,然后再次启动它,原因无关紧要.
那么:为什么会这样呢?我有什么办法可以解决这个问题(所以只有在有正当理由的情况下才会调用onStop)?
笔记:
singleTasklaunchmode如何检测按下的电源按钮或锁定屏幕按钮?当我的游戏以这种方式暂停时,它会导致游戏崩溃,因为我需要在线程发生时暂停它.
所以我才意识到,当点击电源按钮关闭屏幕时,onStop会在我的Activity中被调用.以前只调用onPause.这是KitKat的变化,并且在任何地方都有关于它的说明(是故意的)吗?这是KitKat的变化还是特定制造商实施的?
编辑:我将很快更新这个更多信息.我认为这种变化比我第一次意识到的更微妙,可能是因为我持有部分唤醒锁或听取GPS更新.无论如何,我所知道的是,在我的代码中,在KitKat之前,单击电源按钮时未调用onStop.也许这也取决于设备.
编辑:新信息.通过以下设置,单击电源按钮时不会调用onStop():Android minSDKVersion = 4,targetSDKVersion = 8,(如果使用Android Studio,则设置compileSdkVersion = 8).在2台设备上验证了这一点(运行KitKat和JellyBean)所以这个问题不是原始中首次提到的KitKat,而是最小的目标sdk设置.Bounty将被授予任何人可以找到更改时的参考,或者至少显示第一个最小/目标sdk设置,该设置更改了从电源按钮单击调用onStop的行为.