1. AMS、WMS、SerfaceFlinger的主要作用。
乍一听,在面试中,我回答的是AMS主要管理Activity,WMS负责窗口管理,SurfaceFlinger是Ui绘制相关。这样回答应该也没错,但是好像不太饱和。
AMS负责维护和管理ActivityStack,而WMS主要负责窗口是和事件分发管理,WMS会向AMS请求Activity(创建或从stack中弹出),SurfaceFlinger位于libraries层,WMS会将UI绘制任务传递过来。
2. java GC。
我当时答出了新生代GC复制算法,老年代的标记-清除算法,但好像GC复制算法没有讲清楚。
JVM的GC复制算法:
JVM的内存分配划分了四块:M1, M2,M3和M4, 其中,内存大小:M4 > M1 > M2 = M3。
M4在老年代,新对象的创建会放在M1中,当M1内存满,进行GC时,会将未被回收的内存放在M2中,如此往复,直到M2内存满时,将M2中无法进行回收的对象拷贝到M3,同时,M2和M3的引用进行交换,清空M3(即旧的M2,其中的内存均为可回收),此时,依然存活的对象即升级一次;如果往复当一些对象等级达到一定次数的GC还没有释放即可进行晋升,即进入老年代。
3. android ui的过度绘制和过度渲染问题
实事求是的说,工作中对过度渲染还是比较注意的(即Ui层级嵌套过深),但是Ui过度绘制的问题真心就没太关注,甚至乍一被问到,也说不清楚过度绘制的概念。
过度渲染特指UI的层级嵌套过深,可以使用systrace、手机的显示布局边界观察到ui的层级,对有问题的ui进行优化甚至重构。使用一些android的ui组件,比如merge,viewstub等,可以有助于对ui层级进行删减。
而Ui过度绘制问题,可能是某部分ui从开始绘制到绘制完毕时间较长,部分ui本不必刷新却做了多余的刷新导致的。可以通过系统设置内的“调试过度绘制”、“GPU呈现模式”工具可以看到ui绘制的时间,可以据此发现问题,进行优化,
4. android view 遍历过程中的一些细节。
之前仅仅知道view的绘制包括onMeasure、onLayout、onDraw分别对应着计算组件的宽高尺寸、组件所在手机屏幕上位置、ui内容进行绘制,记得getonMeasureHeight()、getHeight分别对应onMeasure,onLayout后获取的高度值。但还有一些细节,就没怎么刻意注意了。
1) onMeasure(intwidthMeasureSpec, intheightMeasureSpec)