• <Android>从窗口泄漏谈android:configChanges属性


    今天有幸去哥们的大公司做了半天的暂时工,一个偶现的Bug折腾了他好久,好不easy今天抓到了异常Log日志。大致的意思就是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"。

    ——以上信息从网上看到,认为非常实用,但自己并没有验证过,只是相信也是LZ验证过发出的,应该会非常实用的。

    附上android:configChanges属性解释:

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














    今天收获不小。见识了大公司的霸气,也加深了android:configChanges属性的了解。


  • 相关阅读:
    【集训第二天·翻水的老师】--ac自动机+splay树
    【集训第一天·特来卖萌】树链剖分之水水的例题
    1.ARM寄存器简解
    2.汇编代码的简单实现
    Android之Activity 生命周期
    Android之SQLite
    魅族 -- 禁止D及以下级别LOG的输出
    常用的SQL语句
    Android开发工具
    Android介绍
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5332019.html
Copyright © 2020-2023  润新知