从窗体泄漏谈android:configChanges属性

来源:互联网 发布:网络电视机顶盒选购 编辑:程序博客网 时间:2024/05/17 06:22

转载自:http://www.bubuko.com/infodetail-457092.html


首先看log日志:has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{1f60f27e V.E..... R.....ID 0,0-388,240} that was originally added here.   android.view.windowleaked——即:窗体泄漏。

Android的每一个Activity都有个WindowManager窗体管理器,构建在某个Activity之上的对话框、PopupWindow也有相应的WindowManager窗体管理器。因为Dialog、PopupWindown不能脱离Activity而单独存在着,所以当承载某个Dialog或者某个PopupWindow正在显示的Activity被finish()后,而Dialog(或PopupWindow)没有正常退出的话,就会抛Window Leaked错误了,因为这个Dialog(或PopupWindow)的WindowManager已经没有谁可以附属了,所以它的窗体管理器就泄漏了。


根据此信息分析出,在进入新的Activity时突然转屏(哥们开发的sdk支持横竖屏切换),因为在AndroidManifest.xml中没有配置android:configChanges属性,此时Activity会重新调用onCreate方法,即会重新调用整个生命周期,而此时的Dialog已经显示并没有dismiss,所以造成了窗体泄漏。解决的方法就变得如此简单,在AndroidManifest.xml中配置android:configChanges属性,这样当我们横竖屏切换的时候会调用Activity的onConfigurationChanged方法,不会重新调用整个生命周期了。我们最后配置了android:configChanges="screenSize|orientation|keyboardHidden|navigation"。

android:configChanges属性:

1、不设置Activity的android:configChanges时,切屏会重新调用整个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用整个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用整个生命周期,只会执行onConfigurationChanged方法

但是,自从Android 3.2(API 13),在设置Activity的android:configChanges="orientation|keyboardHidden"后,还是一样会重新调用各个生命周期的。因为screensize也开始跟着设备的横竖切换而改变。所以在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置"orientation", 你还必须设置" screenSize"。

附上android:configChanges属性解释:

VALUE                        DESCRIPTION                                                                                                                                                                                      "mcc"国际移动用户识别码所属国家代号是改变了-----  sim被侦测到了,去更新mcc    mcc是移动用户所属国家代号"mnc"国际移动用户识别码的移动网号码是改变了------ sim被侦测到了,去更新mnc    MNC是移动网号码,最多由两位数字组成,用于识别移动用户所归属的移动通信网"locale"地址改变了-----用户选择了一个新的语言会显示出来"touchscreen"触摸屏是改变了------通常是不会发生的"keyboard"键盘发生了改变----例如用户用了外部的键盘"keyboardHidden"键盘的可用性发生了改变"navigation"导航发生了变化-----通常也不会发生"screenLayout"屏幕的显示发生了变化------不同的显示被激活"fontScale"字体比例发生了变化----选择了不同的全局字体"uiMode"用户的模式发生了变化"orientation"屏幕方向改变了"screenSize"屏幕大小改变了"smallestScreenSize"屏幕的物理大小改变了,如:连接到一个外部的屏幕上






0 0
原创粉丝点击