【问题标题】:Prevent Android activity from being recreated on turning screen off防止在关闭屏幕时重新创建 Android 活动
【发布时间】:2012-05-16 22:30:51
【问题描述】:

如何防止在关闭屏幕时重新创建活动?

我做什么

  1. 启动 Bejewels 并转到珠宝屏幕。
  2. 短按电源按钮。屏幕已关闭,但设备未关闭。
  3. 再次按下电源按钮。

我所看到的

与关闭屏幕前相同的屏幕。

对于我的应用程序(微不足道的应用程序,只是一个带有单个 WebView 的网络应用程序),场景如下:

我做什么

  1. 启动我的应用程序。 Activity onCreate() 方法将 URL 加载到 WebView 中。
  2. 短按电源按钮。屏幕已关闭,但设备未关闭。
  3. 再次按下电源按钮。

我所看到的

WebView 正在重新加载页面。

我的预期

在 Bejewels 案例中,我希望看到相同的屏幕,对于我的应用来说,该页面是处于其先前状态的页面:脚本正在运行,表单字段正在运行 填充等。

调试表明,我错了(在上一个问题中)并且 onDestroy() 和 onCreate() 在屏幕刚打开时被一个接一个地调用。而且由于我仍然听到由脚本播放的音乐,因此当屏幕关闭时,在我再次按下电源按钮之前,似乎 Activity 和 WebView 都存在。

我试过了。

  1. android:alwaysRetainTaskState="true" 行为相同。
  2. 阅读意图(无济于事,我只是不明白,它们如何应用于我的情况)。
  3. 使用 PhoneGap。它的行为不同:只是在按下电源按钮时杀死整个应用程序。这更好,但不是最好的。

【问题讨论】:

    标签: android-intent android-activity lifecycle lifetime activity-lifecycle


    【解决方案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】:
      1. 在 Application.onCreate() 中创建视图。
      2. 在 Activity.onCreate() 中将视图添加到布局中。
      3. 在 Activity.onDestroy() 中从布局中删除视图。

      详情在这里: Attach/detach Android view to/from layout

      【讨论】:

        猜你喜欢
        • 2013-01-15
        • 2018-03-20
        • 1970-01-01
        • 1970-01-01
        • 2017-12-25
        • 2020-12-31
        • 2011-08-04
        • 1970-01-01
        • 2011-11-28
        相关资源
        最近更新 更多