防止在关闭屏幕时重新创建 Android 活动
Posted
技术标签:
【中文标题】防止在关闭屏幕时重新创建 Android 活动【英文标题】:Prevent Android activity from being recreated on turning screen off 【发布时间】:2012-05-16 22:30:51 【问题描述】:如何防止在关闭屏幕时重新创建活动?
我做什么
启动 Bejewels 并转到珠宝屏幕。 短按电源按钮。屏幕已关闭,但设备未关闭。 再次按下电源按钮。
我所看到的
与关闭屏幕前相同的屏幕。
对于我的应用程序(微不足道的应用程序,只是一个带有单个 WebView 的网络应用程序),场景如下:
我做什么
启动我的应用程序。 Activity onCreate() 方法将 URL 加载到 WebView 中。 短按电源按钮。屏幕已关闭,但设备未关闭。 再次按下电源按钮。
我所看到的
WebView 正在重新加载页面。
我的预期
在 Bejewels 案例中,我希望看到相同的屏幕,对于我的应用来说,该页面是处于其先前状态的页面:脚本正在运行,表单字段正在运行 填充等。
调试表明,我错了(在上一个问题中)并且 onDestroy() 和 onCreate() 在屏幕刚打开时被一个接一个地调用。而且由于我仍然听到由脚本播放的音乐,因此当屏幕关闭时,在我再次按下电源按钮之前,似乎 Activity 和 WebView 都存在。
我试过了。
-
android:alwaysRetainTaskState="true" 行为相同。
阅读意图(无济于事,我只是不明白,它们如何应用于我的情况)。
使用 PhoneGap。它的行为不同:只是在按下电源按钮时杀死整个应用程序。这更好,但不是最好的。
【问题讨论】:
【参考方案1】:这个问题的解决方法可能和这里描述的一样:onDestroy gets called each time the screen goes on
由于配置更改,您的活动似乎正在重新启动,请参阅http://developer.android.com/guide/topics/resources/runtime-changes.html。最常见的情况是当您的应用程序处于横向模式(与大多数游戏一样),然后通过点击电源按钮启用屏幕锁定。屏幕锁定处于纵向模式,因此会触发方向更改,从而触发 Activity 重新启动。
可以通过添加以下内容来覆盖此行为:
android:configChanges="orientation|keyboardHidden"
...如果您的目标 API 级别低于 13,则添加到清单文件中。或者
android:configChanges="orientation|keyboardHidden|screenSize"
...如果您的目标 API 级别高于 13。
请注意,您可能需要转到 project->properties 并更新您的项目构建目标。如果您的构建目标小于 13,将无法识别“screenSize”。
可能是不同的配置更改导致活动被重置。以下链接提供了可能的配置更改列表:http://developer.android.com/guide/topics/manifest/activity-element.html#config
【讨论】:
【参考方案2】:添加:
android:launchMode="singleTop"
到清单 xml 中的活动部分。 看这里http://developer.android.com/guide/topics/manifest/activity-element.html
【讨论】:
什么都没有改变。 (我没有删除 android:alwaysRetainTaskState="true")。 在按下电源按钮关闭屏幕然后再次进入屏幕后 onResume() 被调用,你在 onResume() 中做什么? 1.是的, onResume() 被调用。我已经检查过了(被覆盖并称为 Toast)。 2. 抱歉笨,我只是没想到我必须在 onResume() 中做点什么。所以,它没有被覆盖,现在它只包含 Toast 调用。 3.现在的行为如下:第一次按下按钮后,当屏幕关闭时,页面正在后台重新加载(音乐停止播放然后从头开始播放,网页的onload部分有一个javascript开始音乐播放)。【参考方案3】:-
在 Application.onCreate() 中创建视图。
在 Activity.onCreate() 中将视图添加到布局中。
在 Activity.onDestroy() 中从布局中删除视图。
详情在这里: Attach/detach Android view to/from layout
【讨论】:
以上是关于防止在关闭屏幕时重新创建 Android 活动的主要内容,如果未能解决你的问题,请参考以下文章