防止在关闭屏幕时重新创建 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 活动的主要内容,如果未能解决你的问题,请参考以下文章

防止android在崩溃后重新创建活动堆栈

防止 Android 重新创建已经存在的活动

防止在Android中的屏幕旋转对话框解除

从通知启动时防止重新创建活动活动

如何在 Android M 或更高版本中在运行时更改权限时防止重新创建 Activity

关闭并重新打开应用程序时Android崩溃