我的游戏在设备显示在锁定屏幕上时播放声音时遇到问题,就像那里讨论的那样。由于某些原因,我不能要求用户输入来恢复游戏,所以我想捕捉 onWindowFocusChanged 事件以恢复游戏。不幸的是,描述的解决方案在我的情况下不起作用。
应用程序使用横向。AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.application.applicationname"
android:versionCode="1"
android:versionName="1.0">
<supports-screens android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"/>
<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="16"/>
<application android:label="@string/app_name"
android:debuggable="true"
android:icon="@drawable/icon">
<!-- main application activity -->
<activity android:name="com.application.applicationname.Activity"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:configChanges="orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
当我使用纵向的手机时,出现了问题。一开始一切都很好。简单日志:
02-12 18:18:28.329: E/activity(15215): onDestroy called
02-12 18:18:28.329: E/activity(15215): onCreate called
02-12 18:18:28.389: E/activity(15215): onStart called
02-12 18:18:28.389: D/activity(15215): onResumeCalled
02-12 18:19:06.329: D/activity(15215): onWindowFocusChanged called with focus = true
但是当我按下电源按钮锁定设备然后解锁时:
02-12 18:30:55.629: E/activity(22605): onPause called
02-12 18:30:55.629: E/activity(22605): onStop called
02-12 18:30:58.379: E/activity(22605): onDestroy called
02-12 18:30:58.839: E/activity(22605): onCreate called
02-12 18:30:58.839: E/activity(22605): onStart called
02-12 18:30:58.839: D/activity(22605): onResumeCalled
02-12 18:30:58.849: D/activity(22605): onPauseCalled
02-12 18:30:59.219: D/activity(22605): onResumeCalled
02-12 18:30:59.479: D/activity(22605): onPauseCalled
02-12 18:30:59.559: E/activity(22605): onStop called
02-12 18:34:01.899: E/activity(22605): onRestart called
02-12 18:34:01.899: E/activity(22605): onStart called
02-12 18:34:01.909: D/activity(22605): onResumeCalled
02-12 18:34:20.409: D/activity(22605): onPauseCalled
02-12 18:34:20.409: E/activity(22605): onStop called
02-12 18:34:20.409: E/activity(22605): onDestroy called
02-12 18:34:20.609: E/activity(22605): onCreate called
02-12 18:34:20.609: E/activity(22605): onStart called
02-12 18:34:20.609: D/activity(22605): onResumeCalled
02-12 18:34:20.769: D/activity(22605): onWindowFocusChanged called with focus = true
onWindowFocusChanged(false) 从不调用,之前链接中描述的解决方案不起作用。
此外,我有点担心在设备锁定/解锁时会有很多 onDestroy/onCreate 调用。据我了解,这是因为活动将其方向从横向(用于游戏)更改为纵向(用于设备锁定屏幕)并返回到横向。但是对于这样的破坏活动,没有时间调用 onWindowFocusChanged(false)。
所以,我的问题:
- 如何解决锁定屏幕上播放声音的原始问题?
- 是否可以不多次调用 onDestroy/onCreate ?
感谢您的关注。
UPD我已经从这里实现了解决方案,并且在我的设备上一切正常,但我不确定这个解决方案是否完全正确。在第一个链接中:
如果设备自行入睡,或者如果用户锁定手机然后立即解锁,您的应用可能根本不会收到任何焦点更改消息。
所以,我不确定在所有情况下都会调用 onWindowFocusChanged(true)。这是可能的解决方案吗?
UPD 2关于多次调用 onDestroy/onCreate :正如在 google Activity API 中关于配置更改所写的那样,我试图拦截显示方向的配置更改,但它对我来说效果不佳。