そこで説明したように、デバイスのディスプレイがロック画面に表示されているときにサウンドを再生すると、ゲームで問題が発生します。何らかの理由で、ゲームを再開するためにユーザー入力を要求できないため、ゲームを再開するために 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 hereからソリューションを実装しましたが、私のデバイスではすべて正常に動作しますが、このソリューションが完全に正しいかどうかはわかりません。最初のリンク:
デバイスが自動的にスリープ状態になった場合、またはユーザーが電話をロックしてすぐにロックを解除した場合、アプリはフォーカス変更メッセージをまったく受信しない可能性があります。
したがって、すべての場合に onWindowFocusChanged(true) が呼び出されるかどうかはわかりません。それは可能な解決策ですか?
UPD 2 onDestroy/onCreate の複数回の呼び出しについて: 構成の変更について google Activity API に書かれているように、ディスプレイの向きの構成の変更をインターセプトしようとしましたが、うまくいきません。