3

我的游戏在设备显示在锁定屏幕上时播放声音时遇到问题,就像那里讨论的那样。由于某些原因,我不能要求用户输入来恢复游戏,所以我想捕捉 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)。

所以,我的问题:

  1. 如何解决锁定屏幕上播放声音的原始问题?
  2. 是否可以不多次调用 onDestroy/onCreate ?

感谢您的关注。

UPD我已经从这里实现了解决方案,并且在我的设备上一切正常,但我不确定这个解决方案是否完全正确。在第一个链接中:

如果设备自行入睡,或者如果用户锁定手机然后立即解锁,您的应用可能根本不会收到任何焦点更改消息。

所以,我不确定在所有情况下都会调用 onWindowFocusChanged(true)。这是可能的解决方案吗?

UPD 2关于多次调用 onDestroy/onCreate :正如在 google Activity API 中关于配置更改所写的那样,我试图拦截显示方向的配置更改,但它对我来说效果不佳。

4

1 回答 1

0

对于第一个答案:您可以考虑处理lonk /解锁屏幕事件的选项,而不是处理焦点更改:android.intent.action.SCREEN_ON,android.intent.action.SCREEN_OFF。

这样您就可以注意到手机何时锁定/解锁并处理声音问题。

关于第二个问题,这可能与方向配置更改有关。可能您没有像 Android 预期的那样处理事件,它试图扭转局面。但这一个我不知道如何解决。

于 2013-02-12T12:16:02.960 回答