Я работаю над этой проблемой прямо сейчас, и в этот момент представляется ошибкой Android, связанной с SurfaceHolder.setFixedSize ().
Что я делаю, чтобы получить эти логи, так это: дождитесь загрузки игры, включите питание, дайте экрану погаснуть, снова включите питание (быстро), разблокируйте слайд (быстро).Кстати, это в HTC Thunderbolt 2.3.4.
Вот нормальный ход событий (без использования setFixedSize):
----- power button pushed ------
JavaMain: onPause: called, thread: 1
ActivityManager: Config changed: { scale=1.0 imsi=310/12 loc=en_US touch=3 keys=1/1/2 nav=1/1 orien=1 layout=34 uiMode=17 seq=1509 skin=default}
JavaMain: onConfigurationChanged, orientation: 1 thread: 1
JavaMain: mSView(old): 800x480
JavaMain: surfaceChanged: width: 480, height:800, thread: 1
JavaMain: onWindowFocusChanged: called, thread: 1
(screen is now off)
------ power button pushed, and slide-lock undone -----
JavaMain: onResume: called, thread: 1
ActivityManager: Config changed: { scale=1.0 imsi=310/12 loc=en_US touch=3 keys=1/1/2 nav=1/1 orien=2 layout=34 uiMode=17 seq=1510 skin=default}
JavaMain: onConfigurationChanged, orientation: 2 thread: 1
JavaMain: mSView(old): 480x800
JavaMain: onWindowFocusChanged: called, thread: 1
JavaMain: surfaceChanged: width: 800, height:480, thread: 1
(back in game)
Обратите внимание, что после onPause мой вид поверхностипеределан в качестве портрета и после onResume он возвращается обратно в ландшафт.У меня screenOrientation установлен в ландшафт в манифесте.
Теперь посмотрим, что происходит во время той же последовательности, но теперь используется SurfaceHolder.setFixedSize () (для уменьшения разрешения):
----- power button pushed -------
JavaMain: onPause: called, thread: 1
ActivityManager: Config changed: { scale=1.0 imsi=310/12 loc=en_US touch=3 keys=1/1/2 nav=1/1 orien=1 layout=34 uiMode=17 seq=1513 skin=default}
JavaMain: onConfigurationChanged, orientation: 1 thread: 1
JavaMain: mSView(old): 800x480
JavaMain: surfaceChanged: width: 640, height:384, thread: 1
JavaMain: onWindowFocusChanged: called, thread: 1
(screen is now off)
------ power button pushed, and slide-lock undone -----
JavaMain: onResume: called, thread: 1
ActivityManager: Config changed: { scale=1.0 imsi=310/12 loc=en_US touch=3 keys=1/1/2 nav=1/1 orien=2 layout=34 uiMode=17 seq=1514 skin=default}
JavaMain: onConfigurationChanged, orientation: 2 thread: 1
JavaMain: mSView(old): 480x800
JavaMain: onWindowFocusChanged: called, thread: 1
(back in game, with a messed up screen as in OP)
Теперь обратите вниманиечто после onPause surfaceChanged отражает заданный мной фиксированный размер, однако при onResume вид поверхности находится в портретной ориентации (что несколько неожиданно). Но чего в действительности не хватает, так это вызова surfaceChanged с моими параметрами фиксированного размера. И, прежде чем вы спросите, никакие действия .setFixedSize () в onConfigurationChanged () не имеют никакого эффекта.
UPDATEИ РЕШЕНИЕ:
Действительно, решение сводилось к восстановлению (фактически, никогда не позволяя никаких изменений) моего вида поверхности.Это достигается добавлением следующих двух строк после супер-вызова в onConfigurationChanged для вашей деятельности.(Как бы то ни было, у вас есть следующий набор настроек манифеста).
android:configChanges="orientation"
android:screenOrientation="landscape"
Это фактически предотвращает установку размеров вида поверхности на что-либо еще (например, портрет). Что, кстати, ЧТО Я ХОЧУ, КОГДА Я УКАЗАЛ screenOrientation = landscape !!! (Я смотрю на тебя здесь, Google)
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// -- stomp any attempts by the OS to resize my view.
// -- Hardcoded values for illustration only. In real life
// -- you'll need to save these when the surface view is originally created
mSView.getLayoutParams().width = 800;
mSView.getLayoutParams().height = 480;
}