这种行为在Android GingerBread中很受欢迎。我已经覆盖onConfigurationChanged()来更新我的设备方向的布局。(更新了清单文件中的android:configChanges属性。)还在应用程序中注册了onOrientationChanged()回调。当我将方向从一个更改为另一个时,它会回调配置和方向更改。(这是预期的)
但是,当我按照以下步骤操作时,有时它不会更新我的布局(获得一些黑屏)
当我跟踪日志时,我可以发现,对于所有方向更改,onOrientationChanged()被调用。但onConfigurationChanged()仅在某些情况下调用。当没有调用onConfigurationChanged()时,黑屏就会出现(我在此回调中使用了setContentView())
任何人都可以告诉我这是什么原因。或者告诉我应该在哪里追踪这个。与方法onConfigurationChanged()一样被调用。
该应用程序在froyo中工作正常。
高级感谢您的帮助
答案 0 :(得分: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
我们可以看到系统看到旋转,但没有人说这个没有人。为什么? 我该如何解决?
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时才调用。
答案 1 :(得分:-1)
仅在先前的功能尚未完成时才会调用它,因为它不会在堆栈中收集调用。