防止 Android 活动在关闭屏幕时重新创建

18
如何防止在关闭屏幕时重新创建活动?
我的应用程序是一个简单的Web应用程序,只有一个WebView。以下是我的情况:
我做了什么: 1. 启动我的应用程序。onCreate()方法将URL加载到WebView中。 2. 短按电源按钮。屏幕关闭,但设备没有关闭。 3. 再次按电源按钮。
我看到了什么: WebView正在重新加载页面。
我期望看到的是: 与Bejewels应用程序一样,我希望看到相同的屏幕,对于我的应用程序来说,它是先前状态下的页面:脚本正在运行,表单字段已填写等。
调试显示,在屏幕打开时,onDestroy()和onCreate()被依次调用。由于当屏幕关闭时我仍然听到由脚本播放的音乐,所以看起来活动和WebView都存在,直到我再次按电源按钮。
我尝试过: 1. android:alwaysRetainTaskState="true" - 相同的行为。 2. 阅读有关意图的信息(无效,我只是不明白它们如何应用于我的情况)。 3. 使用PhoneGap。它的行为不同:只在按电源按钮时杀死整个应用程序。这是更好的,但不是最好的。
3个回答

29

这个问题的解决方案可能与这里描述的相同:onDestroy gets called each time the screen goes on

看起来你的Activity由于配置更改而被重新启动,参见http://developer.android.com/guide/topics/resources/runtime-changes.html。最常见的情况是当你的应用处于横屏模式(像大多数游戏)并且然后通过点击电源按钮锁定屏幕时。屏幕锁定在竖屏模式下,因此会触发方向更改,从而触发Activity被重新启动。

可以通过添加以下内容来覆盖这种行为:

android:configChanges="orientation|keyboardHidden"

如果你的目标API级别低于13,请将以下代码添加到你的清单文件中。或者

android:configChanges="orientation|keyboardHidden|screenSize"

如果你的目标API级别大于13,则需要注意,你可能需要进入项目->属性并更新你的项目构建目标。如果你的构建目标小于13,则“screenSize”将无法被识别。

导致活动重置的可能是不同的配置更改。下面的链接提供了可能的配置更改列表: http://developer.android.com/guide/topics/manifest/activity-element.html#config


1
  1. 在Application.onCreate()中创建视图。
  2. 在Activity.onCreate()中将视图添加到布局中。
  3. 在Activity.onDestroy()中从布局中移除视图。

详细信息请参见: 将Android视图附加/分离到布局


1

没有任何改变。(我没有删除android:alwaysRetainTaskState="true")。 - noober
按下电源按钮使屏幕关闭,再次按下电源按钮使屏幕开启后,onResume()方法被调用。你在onResume()里面做了什么? - Bush
  1. 是的,onResume() 被调用了。我已经检查过了(重写并调用 Toast)。
  2. 对不起,我太蠢了,我没有猜到我需要在 onResume() 中做些什么。所以,它没有被重写,现在它只包含 Toast 调用。
  3. 现在的行为是这样的:第一次按下按钮后,当屏幕关闭时,页面会在后台重新加载(音乐停止播放,然后从头开始播放,网页的 onload 部分有一个启动音乐播放的 JavaScript)。
- noober

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接