防止在锁定时重新启动横向Android应用程序

时间:2012-12-12 08:56:31

标签: android orientation lockscreen

我正在开发一种使用OpenGL并具有背景音乐的游戏。应用程序仅在横向模式下运行。

我遇到的问题,当用户锁定屏幕时发生。此时调用onStop(),屏幕方向会发生变化,并且在我的活动重新启动后不久会因为方向更改而更改。这意味着重新创建OpenGL表面,音乐再次开始播放以及各种其他事物。这是违反直觉的,因为锁定屏幕应该暂停CPU密集型操作,而不是启动它们。

向清单添加android:configChanges="orientation"没有做任何事情。我确实意识到我可能在screenSize中遗失android:configChanges但我无法添加它,因为我的目标是没有此选项的早期API版本。

所以,问题是:处理这个问题的正确方法是什么?我应该在哪个事件中初始化我的应用程序,以便一切按预期工作?

6 个答案:

答案 0 :(得分:5)

在清单中将screenSize添加到configChanges并不意味着您的程序不会在旧版本上运行。您只需将targetSdkVersion设置为更高版本,将minSdkVersion设置为您喜欢的任何内容。在intelljIDEA中,我在项目结构中将ModuleSKD设置为4,因此它不会将screenSize突出显示为无效。它在Eclipse中必须类似。

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" />

<activity android:name=".MyActivity"
      android:label="@string/app_name"
      android:configChanges="orientation|screenSize|keyboard|keyboardHidden|navigation">

您也可以使用以下代码检查版本:

if (Build.VERSION.SDK_INT >= 11) 

这样您的应用就可以使用2.2以及更高版本。

我认为您不需要onConfigurationChanged,因为您的游戏可能只在横向模式下运行,但如果您感兴趣的话,请查看与您的问题非常相似的问题以及我自己的答案。

replace layout on orientation change

答案 1 :(得分:2)

添加标记

"android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout"用于您在Manifest.xml中的活动,

并覆盖方法

public void onConfigurationChanged(Configuration newConfig) {}

答案 2 :(得分:1)

如果您的游戏仅适用于横向模式,请尝试在android:screenOrientation="landscape"标记中设置activity属性。

答案 3 :(得分:1)

        @Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onRestoreInstanceState(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);
}

以上是活动方向发生变化时保存状态的两种方法。它以键值对的形式将数据保存在包对象中。

无需在Androidmanifest.xml文件中添加任何标记。对于上面的代码。

android:screenOrientation="landscape"此标记可用于使您的活动仅在横向模式下运行。此标记应添加在Androidmanifest.xml中的活动标记

答案 4 :(得分:1)

在您的确切情况下,我更喜欢使用它:

@Override
protected void onCreate(final Bundle savedInstance) {
    super.onCreate(savedInstance);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}

适用于所有情况,并强制您的活动仅为风景。

答案 5 :(得分:1)

我认为您需要接受这样一个事实:当手机锁定时,您的活动会暂停和/或停止。这意味着您需要再次启动其中的一些内容。这也是我在阅读使用OpenGL的Android游戏开发书后所理解的。

你能做的比@ 421建议的更多。在那些onSaveInstanceState和onRestoreInstanceState中,您可以存储您所在歌曲的一部分以及任何其他允许游戏“平稳”重新开始的数据,即使它可能需要重新加载某些内容。

如果您现在还没有找到任何其他答案,这可能就是原因。一旦手机锁定,我就会经历许多令人烦恼的游戏。您只需要正确,顺利地手动处理它。