Android屏幕卡顿,电量损耗和Service常驻小结

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

一次绘制任务耗时20ms,那么在16ms系统发出信号时就无法绘制,该帧就被丢弃,等待下次信号才开始绘制,导致16*2ms之内都显示同一帧画面.

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

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

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

三、Android保证Service不被杀死:
1、设置persistent属性为true,设置为常驻应用;系统启动时,ActivityManagerService会通读取系统中所有persistent是true的应用,然后得到一个List,并设置一个监听器,一但应用挂掉,会回调这个监听器相应的方法,如果是persistent为true的应用,则会重启。
2、重写onStartCommand方法,onStartCommand方法有三种返回值,设置返回值为START_STICKY;,当Service因为异常或者内存紧张被系统杀死时,会立即重启;
3、设置为前台进程,提高Service的优先级,避免因为low memory而被系统杀死;
4、流氓用法:设置两个Service相关联,当一个Service被清理掉时,在onDestory中重启另一个Service
5、广播接收器
6、类似QQ一像素
7、在onDestroy()中重启Service服务。但是通过别人应用,如360直接kill掉我的应用时,是不会调用Service的ondestory方法的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值