Android—屏幕适配和优化问题

各自的定义:

  • px:pixel,像素,屏幕上实际的像素点单位
  • dpi: dot per inch,每英寸多少点,该值越高,则图片越细腻
  • dp: dip,Density-independent pixel, 设备独立像素
  • sp: scale-independent pixel,字体大小单位。

像素密度为160时,1dp = 1px

px = dp*(dpi/160) = dp*density

适配方法

  1. 使用wrap_content, match_parent, weight要确保布局的灵活性并适应各种尺寸的屏幕
  2. 使用RelativeLayout或ConstraintLayout,禁用绝对布局。
  3. 使用Nine-Patch图片
  4. 使用Size限定符
  5. 使用Smallest-width限定符

卡顿的两大因素:

界面绘制:主要原因是绘制的层级深、页面复杂、刷新不合理,由于这些原因导致卡顿的场景更多出现在 UI 和启动后的初始界面以及跳转到页面的绘制上。

数据处理:导致这种卡顿场景的原因是数据处理量太大,一般分为三种情况,一是数据在处理 UI 线程,二是数据处理占用 CPU 高,导致主线程拿不到时间片,三是内存增加导致 GC 频繁,从而引起卡顿。

布局优化

  1. 使用ConstraintLayout或者RelativeLayout,ConstraintLayout开销较小,尽量减少布局的重叠和嵌套。
  2. 父布局的宽和高尽量设置成固定值或者match-parent,因为这样在测量尺寸时只需要测量一次。wrap_content,会增加measure计算成本,子View的尺寸可能会动态变化,这样就造成了父布局的尺寸需要多次被测量,影响性能。
  3. 删除控件中无用属性
  4. 通用的布局抽出来通过include包含到指定的布局。这样可以实现布局的复用,既可以提高布局性能,也有利于以后的维护。用include时候需要注意,如果想重写被包含布局的layout属性必须在include标签内重写layout_width和layout_height属性,这样重写其它layout属性才有效。
  5. 如果include标签的外层不是根布局,用merge实现,这样可以减少一层嵌套。用merge实现的布局被include包含后就不能重写其layout属性了(因为merge节点不是一个布局),所以这时候你想对整个被包含布局进行操作(比如设置间距),那么只能在include标签外层包一层布局(比如RelativeLayout),通过该布局来对被包含布局进行整体操作
  6. ViewStub实现懒加载布局。View.GONE方式在Inflate布局的时候View仍然会创建对象,会实例化。通过ViewStub就可以真正实现需要时才加载布局。

自定义View优化

  1. 减少不必要的代码
  2. 不在 onDraw 中做内存分配的事
  3. 减少 onDraw 被调用的次数,调用视图的setVisibility()、setEnabled()、setSelected()等都会导致视图重绘,如果想要手动地强制让视图进行重绘,可以调用invalidate() 来实现。invalidate()只会重调onDraw方法,onMeasure和onLayout不会。postInvalidate方法应用在非UI线程中
  4. 减少 requestLayout 的次数,该方法会重调onDraw,onMeasure和onLayout3个方法。

节省——耗电优化

  • 计算优化
  • 避免 Wake Lock 使用不当

冷启动与热启动

冷启动
在启动应用时,系统中没有该应用的进程,这时系统会创建一个新的进程分配给该应用;

热启动
在启动应用时,系统中已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程还是保留在后台)

区别

  • 冷启动:系统没有该应用的进程,需要创建一个新的进程分配给应用,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。
  • 热启动: 从已有的进程中来启动,不会创建和初始化Application类,直接创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章