gpt4 book ai didi

android - onWindowFocusChanged() 不调用 false,只调用 true

转载 作者:太空狗 更新时间:2023-10-29 15:13:27 46 4
gpt4 key购买 nike

我的游戏在设备显示屏处于锁定屏幕时播放声音时遇到问题,如讨论的那样there .由于某些原因,我不能要求用户输入来恢复游戏,所以我想捕捉 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 的次数过多。据我了解,发生这种情况是因为 Activity 将其方向从横向(用于游戏)更改为纵向(用于设备锁定屏幕)并返回到横向。但是由于这种破坏 Activity ,没有时间调用 onWindowFocusChanged(false)。

所以,我的问题:

  1. 如何解决原来锁屏播放声音的问题?
  2. 可以不多次调用onDestroy/onCreate吗?

感谢您的关注。

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

If the device falls asleep on its own, or if the user locks the phone and then immediately unlocks it, your app may not receive any focus changed messages at all.

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

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

最佳答案

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

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

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

关于android - onWindowFocusChanged() 不调用 false,只调用 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14832042/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com