【问题标题】:onConfigurationChanged() is sometimes not calling when rotating fasteronConfigurationChanged() 有时在旋转更快时不调用
【发布时间】:2011-01-29 10:45:52
【问题描述】:

这种行为在 Android GingerBread 中很受欢迎。我已经覆盖了 onConfigurationChanged() 以在更改设备方向时更新布局。(更新了清单文件中的 android:configChanges 属性。)还在应用程序中注册了一个 onOrientationChanged() 回调。当我将方向从一个更改为另一个时,它会回调配置和方向更改。(这是预期的)

但是当我按照以下步骤操作时,有时它没有更新我的布局(出现一些黑屏)

  • 通过所有 4 个方向连续旋转设备
  • 没有足够的时间在每个方向重绘布局
  • 经过一些旋转后在某个方向停止

当我跟踪日志时,我可以发现对于所有方向更改,onOrientationChanged() 都会被调用。但 onConfigurationChanged() 仅在某些情况下调用。未调用 onConfigurationChanged() 时出现黑屏(我在此回调中使用 setContentView())

谁能告诉我这是什么原因造成的。或者给我指示我应该在哪里追踪这个。就像从方法 onConfigurationChanged() 被调用一样。

该应用程序在 froyo 中运行良好。

感谢您的帮助

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    我也有类似的问题。 如果快速将设备旋转 180 度,则不会调用 onConfigurationChanged()。 另外,如果你删除了 android:configChanges = "orientation" 并快速旋转,那么不要调用 onCreate()。

    日志,慢速旋转:

    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]
    

    日志,快速旋转:

    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
    

    我们可以看到系统看到了旋转,但没有说没有人。为什么? 我该如何解决?

    华为S7,安卓2.2.2。

    UPD

    我找到了答案: “但是风景就是风景,不管它是不是180度, 因此系统可能不会将其视为配置更改。” full discussion here

    来自 Android 来源:

    加速度计监听器 com.android.internal.policy.impl.PhoneWindowManager.MyOrientationListener.onOrientationChanged() - 注意函数调用中的第二个参数,它命名为 alwaysSendConfiguration:

    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 时才会调用。

    【讨论】:

      【解决方案2】:

      只有在前一个函数还没有完成时才调用它,因为它没有收集堆栈中的调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-07
        相关资源
        最近更新 更多