Android 3.2 以上转屏,切换屏幕,横竖屏(onConfigurationChanged)会重新 OnCreate 的解决方案

本文介绍了解决Android 3.2及以上版本中活动转屏导致的onConfigurationChanged未被调用的问题。提供了两种解决方案:一是更新配置更改属性;二是调整targetSdkVersion。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在以前的版本中只要在AndroidManifest.xml文件中对activity指定android:configChanges="keyboardHidden|orientation"属性,转屏的时候就会不再重新调用OnCreate()函数,而是调用onConfigurationChanged()。


但是在自从android3.2以后,再这样设置的话,会发现转屏后仍然会调用OnCreate(),而不是onConfigurationChanged();跟踪framework层代码,就会发现问题所在,是由于google在android3.2中添加了screensize改变的通知,在转屏的时候,不仅是orientation发生了改变,screensize同样也发生了改变,而在判断是调用onConfigurationChanged还是OnCreate时,采用的是如下判断:

int diff = activity.mCurrentConfig.diff(config);


if (diff != 0) {                


// If this activity doesn't handle any of the config changes then don't bother calling onConfigurationChanged as we'regoing to destroy it.


if ((~activity.mActivityInfo.getRealConfigChanged() & diff) == 0) {


shouldChangeConfig = true;


}


}



public int getRealConfigChanged() {


return applicationInfo.targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB_MR2 ? (configChanges | ActivityInfo.CONFIG_SCREEN_SIZE


| ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE) : configChanges;


}




通过上面的分析,可发现有两种方法解决该问题:(只需要修改AndroidManifest.xml)


1.指定android:configChanges="keyboardHidden|orientation|screenSize",其他的代码和以前的代码一样处理;


2.在AndroidManifest.xml中指定targetSdkVersion为3.2以前的版本(3.2的版本号为13),系统会自动加上screenSize属性值。


   比如:<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="12" />  


 


建议使用第一种方法。



onConfigurationChanged not getting called


Caution: Beginning with Android 3.2 (API level 13), the "screen size" also changes when the device switches between portrait and landscape orientation. Thus, if you want to prevent runtime restarts due to orientation change when developing for API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), you must include the "screenSize" value in addition to the "orientation" value. That is, you must decalare android:configChanges="orientation|screenSize". However, if your application targets API level 12 or lower, then your activity always handles this configuration change itself (this configuration change does not restart your activity, even when running on an Android 3.2 or higher device).


(From http://developer.android.com/guide/topics/resources/runtime-changes.html)


http://stackoverflow.com/questions/5620033/onconfigurationchanged-not-getting-called
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值