onConfigurationChanged () иногда не вызывается при быстром вращении - PullRequest
2 голосов
/ 29 января 2011

Такое поведение проявляется в Android GingerBread.Я переопределил onConfigurationChanged (), чтобы обновить макет при изменении ориентации моего устройства. (Обновлен атрибут android: configChanges в файле манифеста). Также зарегистрирован обратный вызов onOrientationChanged () в приложении.Когда я меняю ориентацию с одной на другую, он получает обратный вызов для изменения конфигурации и ориентации (что является ожидаемым)

Но когда я выполняю следующий шаг, иногда не получается обновить мой макет (получитьнемного черного экрана)

  • Поворачивайте устройства непрерывно через все 4 ориентации
  • Не дайте достаточно времени перерисовать макет при каждой ориентации
  • остановитесь в некоторой ориентациипосле некоторых поворотов

Когда я проследил журналы, я могу узнать, что для всех изменений ориентации вызывается onOrientationChanged ().Но onConfigurationChanged () вызывается только в некоторых случаях.Черный экран появляется, когда onConfigurationChanged () не вызывается (я использую setContentView () в стороне этого обратного вызова)

Может кто-нибудь сказать мне, что будет причиной этого.Или дайте мне указание, куда мне обратиться, чтобы отследить это.Вызывается аналогично методу onConfigurationChanged ().

Приложение отлично работает во фройо.

Большое спасибо за помощь

Ответы [ 2 ]

1 голос
/ 15 января 2012

У меня похожая проблема.Если быстро повернуть устройство на 180 градусов, то onConfigurationChanged () не вызывается.Также, если вы удалите android: configChanges = "direction" и быстро поверните, то не вызывайте onCreate ().

Log, медленное вращение:

01-14 03:03:23.401: D/WindowManager(27840): [rotationForOrientationLw] return curRotation: curRotation 0
01-14 03:03:23.401: I/WindowManager(27840): Setting rotation to 0, animFlags=0
01-14 03:03:23.401: I/ActivityManager(27840): Config changed: { scale=1.0 imsi=257/4 loc=ru_RU touch=3 keys=1/1/2 nav=3/1 orien=2 layout=35 uiMode=17 seq=1163}
01-14 03:03:23.411: D/TestActivity(30737): onConfigurationChanged  
01-14 03:03:23.411: D/TestActivity(30737): getRotation:newOrientation = 0
01-14 03:03:23.431: D/PinyinIME(27909): onStartInput  ccontentType: 0 Restarting:true
01-14 03:03:23.451: W/com.skype.raider.MainApp(28091): onConfigurationChanged changed:{ scale=1.0 imsi=257/4 loc=ru_RU touch=3 keys=1/1/2 nav=3/1 orien=2 layout=35 uiMode=17 seq=1163}
01-14 03:03:23.501: I/MyEvent(28098): onReceive:Action=android.intent.action.CONFIGURATION_CHANGED
01-14 03:03:23.501: I/MyEvent(28098): updateUI
01-14 03:03:23.501: I/MyEvent(28098): updateUI,len=1
01-14 03:03:23.511: I/MyEvent(28098): MyEventAppWidgetProvider onUpdate
01-14 03:03:23.511: I/MyEvent(28098): MyEventAppWidgetProvider onUpdate: for=0
01-14 03:03:23.511: I/MyEvent(28098): widgetid=7
01-14 03:03:23.531: E/MyEvent(28098): MyEventAppWidgetService onStart
01-14 03:03:23.701: D/Chi-TRACE(27840): ________current Screen is ORIENTATION_2
01-14 03:03:23.871: D/CChi(27840): ________pause = false
01-14 03:03:24.301: D/skia(30737): purging 195K from font cache [28 entries]

Log, быстрое вращение:

01-14 03:03:55.314: D/WindowManager(27840): [rotationForOrientationLw] return curRotation: curRotation 3
01-14 03:03:55.314: I/WindowManager(27840): Setting rotation to 3, animFlags=0

Мы видим, что система видит вращение, но не говорит об этом никому.Зачем?Как мне это исправить?

HuaweyS7, Android 2.2.2.

UPD

Я нашел ответ: «но пейзаж - это пейзаж, независимо от того, еслиэто 180 градусов, поэтому система может не считать это изменением конфигурации ". полное обсуждение здесь

ТАКЖЕ Из источников Android:

Слушатель акселерометра com.android.internal.policy.impl.PhoneWindowManager.MyOrientationListener.onOrientationChanged () - обратите внимание на второй параметр в вызове функции, он называется всегдаSendConfiguration:

mWindowManager.setRotation(rotation, false, mFancyRotationAnimation);

setRotation () вызывает:

setRotationUnchecked(rotation, alwaysSendConfiguration, animFlags);

И, наконец, в setRotationUnchecked:

synchronized(mWindowMap) {
        changed = setRotationUncheckedLocked(rotation, animFlags);
    }
    if (changed || alwaysSendConfiguration) {
        sendNewConfiguration();
    }

Где в sendNewConfiguration () вызывается ActivityManager, и он вызывается только в том случае, если конфигурация изменилась или если для AlwaysSendConfiguration установлено значение true.

0 голосов
/ 15 января 2012

она не вызывается, только если предыдущая функция еще не завершена, потому что она не собирает вызовы в стеке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...