<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属性的了解。
<Android>从窗口泄漏谈android:configChanges属性的更多相关文章
- [Android 泥水匠] Android基础 之一:浅谈Android架构到HelloWorld案例的剖析
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 交流QQ群:[编程之美 365234583] ...
- android窗口泄漏,isInEditMode解决可视化编辑器无法识别自定义控件的问题
android窗口泄漏 在做项目是遇到这个错误:google:WindowManager: Activity has leaked window. 产 生原因:我们知道Android的每一个Activ ...
- 浅谈Android应用性能之内存
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/ jaunty [博主导读]在Android开发中,不免会遇到许多OOM现象,一方面可能是由于开 ...
- 浅谈Android样式开发之View Animation (视图动画)
引言 一个用户体验良好的App肯定少不了动画效果.Android为我们提供了2种动画框架,分别是视图动画(View Animation)和属性动画(Property Animation).视图动画比较 ...
- 浅谈Android样式开发之selector
引言 上一篇Android UI中文章我们详细介绍了Android中shape标签的使用.通过shape标签我们可以定义矩形.椭圆.环形.直线等效果.不过shape只能定义单一的形状,在实际开发中,我 ...
- Android安全开发之浅谈密钥硬编码
Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...
- 浅谈Android应用保护(一):Android应用逆向的基本方法
对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...
- Android内存优化-内存泄漏的几个场景以及解决方式
转自:http://blog.csdn.net/a910626/article/details/50849760 一.什么是内存泄漏 在Java程序中,如果一个对象没有利用价值了,正常情况下gc是会对 ...
- 系统剖析Android中的内存泄漏
[转发]作为Android开发人员,我们或多或少都听说过内存泄漏.那么何为内存泄漏,Android中的内存泄漏又是什么样子的呢,本文将简单概括的进行一些总结. 关于内存泄露的定义,我可以理解成这样 没 ...
随机推荐
- scrollView的几个属性contentSize contentOffset contentInset
01- ontentSize是scrollview可以滚动的区域 比如frame = (0 ,0 ,320 ,480) contentSize = (320 ,960), 代表你的scrollvie ...
- ThinkPHP3.2.3验证码显示、刷新、校验
显示验证码 首先在Home/Controller下创建一个公共控制器PublicController <?php namespace Home\Controller; use Think\Con ...
- xml解析代码示例
List<Entry> list = new ArrayList<>(); Entry entry = null; try { int eventType = response ...
- maven 的 oracle的Missing artifact com.oracle:******:jar:11.2.0.2.0
解决方法: 下载ojdbc6对应版本号的包.把下载的包放到: 然后dos命令: -Dpackaging=jar -Dfile=ojdbc6.jar 主:必须确保已经配置了你maven,如何配置mave ...
- IPv6 tutorial 2 New features: Routing
https://4sysops.com/archives/ipv6-part-2-new-features-routing/ Routing路由选择 In the last post of my IP ...
- JavaScript功能一览
// 10) throw "太大"; if(x0) { c_start=document.cookie.indexOf(c_name + "=") if (c_ ...
- mapreduce源码分析总结
一 MapReduce概述 Map/Reduce是一个用于大规模数据处理的分布式计算模型,它最初是由Google工程师设计并实现的,Google已经将它完整的MapReduce论 文公开发布了.其中对 ...
- .NET System.Timers.Timer的原理和使用(开发定时执行程序)
概述(来自MSDN) Timer 组件是基于服务器的计时器,它使您能够指定在应用程序中引发Elapsed 事件的周期性间隔.然后可以操控此事件以提供定期处理.例如,假设您有一台关键性服务器,必须每周7 ...
- windows下的BT服务器搭建方案
BT下载可以说是目前网络上最流行的P2P文件共享方式了.BT服务器相比于FTP服务器有许多优势,其中最重要的一点就是BT服务器不受服务器带宽和连接到服务器用户数量的限制,能够提供高速的下载服务.今天, ...
- nginx-rrd监控nginx访问数
一 .查看已安装的nginx是否包含stub_status模块 /usr/local/nginx/sbin/nginx -V nginx version: Nginx/1.2.0 configure ...