1. 一个Activity构造的时候一定会构造一个Window(准确的说是一个PhoneWindow,PhoneWindow 继承自View)此Window有且只有一个。
2. 这个Window有一个ViewRoot,它是一个逻辑性的根视图,实际上就是一个View类或者是一个ViewGruop类 。
对于PhoneWindow 来说,它的 viewRoot 是 Decorview。
3.那么,在这个ViewRoot的根视图上面就会添加一个一个的View,也就是执行addView()方法,来达到我们最终显示的效果。
对于PhoneWindow 来说, addView() 被添加在 Decorview里。
4.WindowManagerService接收消息,并且回调Activity函数,比如典型的onKeyDown()
View --------getViewRoot() 得到 根view Decorview
继承
ViewGroup
继承
window FrameLayout
继承 继承
activity PhoneWindow Decorview
android:windowSoftInputMode="adjustResize" The activity's main window is always resized to make room for the soft keyboard on screen. 当软键盘弹出时,window 会重新计算区域,为软键盘留出空间。 也就是说,Decorview 会将含有的原有布局 高度变小,留出底部一部分空间, 留出的空间底色应当为 Decorview 的底色。
浏览器界面隐藏搜狗输入法时,出现黑屏现象 ---说明这时 window 的底色应为 黑色,可是在 style.xml 文件中 设置的window 背景色为 白色,
黑白转换 只在 一个新的tab页面被创建并展示出来时出现,说明在这个过程中 有地方改变了window 背景色。
要改变window背景色 所有方法最终要走到 view.java中
setBackgroundColor(color),setBackgroundResource(id), setBackgroundDrawable(drawable);
而 setBackgroundColor(color),setBackgroundResource(id) 最终也是走的setBackgroundDrawable(drawable)。
所以setBackgroundDrawable(drawable)在变色过程中一定会调用, 然后抓个异常查看调用流程,找到问题点即可。
只注意到了 setBackgroundColor(color),setBackgroundResource(id) ,没有深入挖掘出 setBackgroundDrawable(drawable);
如何解决问题
1 分析现象,确定问题范围, 列出可能原因,逐条排除。
2 不太清楚的话,查询 关键字, 知道 大致范围, 直接去
3 所有程序都是通过一个个管子链接在一起, 深入挖掘,看看能不能找到 必经的管道, 最终点,深入挖掘一下。