3

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

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

添加android:configChanges="orientation"到清单什么也没做。我确实意识到我可能遗漏screenSize了它,android:configChanges但我无法添加它,因为我的目标是早期的 API 版本,它没有此选项可用。

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

4

6 回答 6

5

将 screenSize 添加到清单中的 configChanges 并不意味着您的程序不会在旧版本上运行。您只需要将 targetSdkVersion 设置为更高版本,将 minSdkVersion 设置为您喜欢的任何内容。在 intelljIDEA 中,我在 Project Structure 中将 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 因为您的游戏可能仅在横向模式下运行,但如果您有兴趣看看我的问题与您的问题和我自己的答案非常相似。

在方向更改时替换布局

于 2012-12-28T14:26:40.613 回答
2

添加标签

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

并覆盖该方法

public void onConfigurationChanged(Configuration newConfig) {}
于 2012-12-26T12:50:12.927 回答
1

在你的确切情况下,我更喜欢使用这个:

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

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

于 2012-12-31T12:09:28.910 回答
1

我认为您需要接受这样一个事实,即当手机锁定时,您的活动会暂停和/或停止。这意味着您将需要重新开始其中的一些事情。这也是我在阅读了一本使用 OpenGL 的 Android 游戏开发书籍后所理解的。

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

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

于 2012-12-31T14:59:18.583 回答
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);
}

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

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

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

于 2012-12-31T11:30:28.310 回答
1

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

于 2012-12-26T13:12:05.217 回答