防止在锁定状态下重新启动Android应用程序

防止在锁定状态下重新启动Android应用程序,android,orientation,lockscreen,Android,Orientation,Lockscreen,我正在开发一款使用OpenGL并带有背景音乐的游戏。应用程序仅在横向模式下运行 我遇到的问题,发生在用户锁定屏幕时。此时调用onStop(),屏幕方向将更改,并且在我的活动因方向更改而重新启动后不久。这意味着OpenGL曲面将被重新创建,音乐将重新开始播放,以及其他各种各样的事情。这是违反直觉的,因为锁定屏幕应该暂停CPU密集型操作,而不是启动它们 将android:configChanges=“orientation”添加到清单中没有任何作用。我确实意识到我可能在android:configC

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

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

将android:configChanges=“orientation”添加到清单中没有任何作用。我确实意识到我可能在
android:configChanges
中缺少
screenSize
,但我无法添加它,因为我针对的是没有此选项的早期API版本

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

添加标记

“android:configChanges=”键盘|键盘隐藏|方向|屏幕大小|屏幕布局”
,用于Manifest.xml中的活动

并重写该方法

public void onConfigurationChanged(Configuration newConfig) {}

如果您的游戏仅适用于横向模式,请尝试设置
android:screenOrientation=“横向”“
活动
标记中的
属性。

将屏幕大小添加到清单中的配置更改并不意味着您的程序不会在旧版本上运行。您只需要将targetSdkVersion设置为更高版本,将minSdkVersion设置为您喜欢的任何版本。在intelljIDEA中,我在项目结构中将ModuleSKD设置为4,这样就不会突出显示屏幕大小无效。它在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">
这样,你的应用程序可以在2.2及更高版本上运行

我想你不需要改变onconfiguration,因为你的游戏可能只在横向模式下运行,但是如果你感兴趣的话,可以看看我的问题,我的答案和你的非常相似

以上是活动中的两种方法,用于在活动方向更改时保存状态。它以键值对的形式将数据保存在bundle对象中

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


android:screenOrientation=“landscape”
此标记可用于使您的活动仅在横向模式下运行。此标记应添加到Androidmanifest.xml中的活动标记中。在您的确切情况下,我更愿意使用此标记:

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

在所有情况下都有效,并强制您的活动仅限于横向。

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

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


如果你现在还没有找到任何其他答案,这可能就是原因。我曾经经历过很多烦恼,当手机锁定时,游戏会做一些奇怪的事情。您只需手动正确平稳地处理即可。

手机锁定时游戏正在重新启动?否。我的活动。每次方向改变,Android都会重新创建活动。嗯,我必须尝试覆盖该方法。我会尽快回复你的,我还没试过呢。对不起,我有点慢,没用。行为是一样的。锁定屏幕后,我的活动将重新启动。android:configChanges=“orientation | keyboardHidden | screenSize | screenSize | screenLayout”当我尝试将其添加到清单文件时,Eclipse会出现以下错误:“错误:不允许使用字符串类型(在'configChanges'处,值为'orientation | screenSize | keyboardHidden | navigation')。”屏幕大小是在Android 3.0中引入的,所以我不能在2.2中添加它。即使删除它也无济于事。@MeanEYE请尝试IntellijIDEA,它的社区版是免费的,比eclipse更快、功能更丰富。我没有eclipse,所以我无法告诉您第一条评论有什么问题。@MeanEYE没有问题,您可以在旧设备上运行新标记。我再次告诉你们我如何在Intellij中配置它,你们进入文件菜单,项目结构,模块,选择你们的模块,在依赖项选项卡中,选择android 3.0+作为模块sdk,这样它就不会抱怨未知属性了。在舱单中,将minsdk设置为8(2.2)或任何值。现在你的代码编译没有任何错误,它仍然在8+设备上工作。通过检查正确的版本,您甚至可以在代码中调用更高版本的API。@MeanEYE如果您得到了Intellj,但做不到,请告诉我,我将为您创建一个符合此要求的工作项目。我想我最终将不得不这样做。谢谢
        @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);
}
@Override
protected void onCreate(final Bundle savedInstance) {
    super.onCreate(savedInstance);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}