Android小知识

一、屏幕出现卡顿的原因:
表面原因:
1、在UI主线程中执行比如像网络下载等耗时的操作,致使CPU没有能力在16ms内完成对下一帧显示数据的处理
2、需要显示的界面太过复杂,比如布局的层次较深,界面控件过多等,给CPU与GPU的渲染造成压力
3、手机硬件GPU、CPU处理能力有限,FPS低于16ms,造成卡顿;Android 4.1后Triple Buffering三缓冲机制一定程度上缓解了该问题。
4、单个帧处理事件内JVM GC次数过多,由于GC 需要stop the world,GC 次数过多可能占用较多的CPU处理时间。而造成GC次数过多的原因可能有:1)内存抖动,即短时间内大量对象被创建又立即被销毁;2)瞬间创建大量对象,占用过多内存,使得JVM不得不提前进行GC来回收内存空间。

由Android的显示机制知,在下一个VSYNC信号到来时,由于前面所述的原因,下一个要显示的帧的信息在Back Buffer并未准备好,则Frame Buffer只能显示前一个帧,造成JANK这样的卡顿的情况。

解决方法:
1、降低界面的布局复杂度以及控件数量,优化界面布局(使用Hierarchy Viewer工具来分析)
1)使用来重用layout
2)使用viewStub来延迟界面加载(相对于gone,viewstub只有在需要时才会被加载,而第一次加载后,viewStub就会转化为一个普通控件)
2、采用异步处理的方式,避免将耗时的任务放在UI线程中进行处理。
3、尽量减少Overdraw (使用Android开发者工具中的Enable GPU Overdraw来判断界面Overdraw的次数)
4、良好的Java编程习惯,避免创建大量的短生命周期对象(避免发生内存抖动的情况)。

CPU、GPU处理图片原理:

Resterization栅格化是绘制那些Button,Shape,Path,String,Bitmap等组件最基础的操作。它把那些组件拆分到不同的像素上进行显示。这是一个很费时的操作,GPU的引入就是为了加快栅格化的操作。

CPU负责把UI组件计算成Polygons,Texture纹理,然后交给GPU进行栅格化渲染。

CPU、GPU计算,绘制以及渲染都需要在一帧16ms中完成。

二、减少电量损耗的措施:

有下面一些措施能够显著减少电量的消耗:
- 我们应该尽量减少唤醒屏幕的次数与持续的时间,使用WakeLock来处理唤醒的问题,能够正确执行唤醒操作并根据设定及时关闭操作进入睡眠状态。
- 某些非必须马上执行的操作,例如上传歌曲,图片处理等,可以等到设备处于充电状态或者电量充足的时候才进行。
- 触发网络请求的操作,每次都会保持无线信号持续一段时间,我们可以把零散的网络请求打包进行一次操作,避免过多的无线信号引起的电量消耗。关于网络请求引起无线信号的电量消耗,还可以参考这里http://hukai.me/android-training-course-in-chinese/connectivity/efficient-downloads/efficient-network-access.html

三、Android保证Service不被杀死:
1、设置persistent属性为true,设置为常驻应用;Android boot时,就会启动这些persistent设置为true的应用,这些应用从开机开始,生命周期一直持续到关闭手机,当出现异常,系统会尝试立即重启;
2、重写onStartCommand方法,onStartCommand方法有三种返回值,设置返回值为START_REDELIVERY_INTENT,当Service因为异常或者内存紧张被系统杀死时,会立即重启;
3、设置为前台进程,设置Service的优先级为最高优先级,避免因为low memory而被系统杀死;
4、流氓用法:设置两个Service相关联,当一个Service被清理掉时,在onDestory中重启另一个Service
参考:http://www.android100.org/html/201406/06/19765.html
http://blog.csdn.net/mad1989/article/details/22492519
http://my.oschina.net/youranhongcha/blog/269591

你可能感兴趣的:(android)