gpt4 book ai didi

android - onConfigurationChanged() 有时在旋转更快时不调用

转载 作者:行者123 更新时间:2023-11-29 14:09:02 25 4
gpt4 key购买 nike

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

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

  • 在所有 4 个方向上连续旋转设备
  • 不要给每个方向重新绘制布局的足够时间
  • 在一些旋转后在某个方向停止

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

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

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

非常感谢您的帮助

最佳答案

我也有类似的问题。如果快速旋转设备 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

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

HuaweyS7, Android 2.2.2.

UPD

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

还有来自 Android 来源:

Accelerometer listener 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 时调用。

关于android - onConfigurationChanged() 有时在旋转更快时不调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4836428/

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