我正在开发一种使用OpenGL并具有背景音乐的游戏。应用程序仅在横向模式下运行。
我遇到的问题,当用户锁定屏幕时发生。此时调用onStop()
,屏幕方向会发生变化,并且在我的活动重新启动后不久会因为方向更改而更改。这意味着重新创建OpenGL表面,音乐再次开始播放以及各种其他事物。这是违反直觉的,因为锁定屏幕应该暂停CPU密集型操作,而不是启动它们。
向清单添加android:configChanges="orientation"
没有做任何事情。我确实意识到我可能在screenSize
中遗失android:configChanges
但我无法添加它,因为我的目标是没有此选项的早期API版本。
所以,问题是:处理这个问题的正确方法是什么?我应该在哪个事件中初始化我的应用程序,以便一切按预期工作?
答案 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,因为您的游戏可能只在横向模式下运行,但如果您感兴趣的话,请查看与您的问题非常相似的问题以及我自己的答案。
答案 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中,您可以存储您所在歌曲的一部分以及任何其他允许游戏“平稳”重新开始的数据,即使它可能需要重新加载某些内容。
如果您现在还没有找到任何其他答案,这可能就是原因。一旦手机锁定,我就会经历许多令人烦恼的游戏。您只需要正确,顺利地手动处理它。