Android优化系列——网络和电量优化

今天我们分享网络和电量优化部分。

网络优化. 移动端对额App几乎都是联网的,网络延迟等会对App的性能产生较大的影响,网络优化可以节约网络流量和电量

DNS域名的系统,主要的功能根据应用请求所用的域名URL去网络上面映射表中查相对应的IP地址,这个过程有可能会消耗上百毫秒,而且可能存在着DNS劫持的危险,可以替换为Ip直接连接的方式来代替域名访问的方法,从而达到更快的网络请求,但是使用Ip地址不够灵活,当后台变换了Ip地址的话,会出现访问不了,前段的App需要发包,解决方法是增加Ip地址动态更新的能力,或者是在IP地址访问失败了,切换到域名的访问.

Demo--->ping 一个地址,不正确的话,切换到备用的地址

PingWorker 类

合并网络请求,一次完整的Http请求,首先进行的是DNS查找,通过TCP三次握手,从而建立连接,如果是https请求的话,还要经过TLS握手成功后才可以进行连接,对于网络请求,减少接口,能够合并的网络请求就尽量合并

SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。

HTTPS和HTTP的区别主要为以下四点:

一、https协议需要到ca申请证书,一般免费证书很少,需要交费。

二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

预先获取数据能够将网络请求集中在一次,这样其他时间段手机就可以切换到空闲的时间,从而避免经常性的唤醒,从而节约用电

避免轮询:如果说每个一段时间需要向服务器发起主动的网络请求,其实不建议在app端做这样的操作,可以使用推送,如果说在不得已的情况下,也要避免使用Thread.sleep()函数来循环等待,建议使用系统的AlarmManager来实现定时轮询,AlarmManager 可以保证在系统休眠的时候,CPU也可以得到休息,在下一次需要发起网络球球的时候才唤醒

尽量避免网络请求失败时候,无限制的循环重试连接,在我第一篇简书博客有写过一个网络加载的框架 :MVP网络框架(Retorfit+Rxjava+Rxandroid)中有提到过

离线缓存,对于图片或者文件,内存缓存+磁盘缓存+网络缓存,一般我们本地需要做的是二级缓存,当缓存中存在图片或者是文件,直接从缓存中读取,不会走网络,下载图片,在Android中使用LruCache实现内存缓存,DiskLruCache实现本地缓存

压缩数据的大小:可以对发送服务端数据进行gzip压缩,同时可以使用更优的数据传输格式,例如二进制的代替Json格式,这个比较牛逼,估计运用的很少,使用webp格式代替图片格式

不同的网络环境使用不同的超时策略,常见的网络格式有 2g、3g、4g、wifi,实时的更新当前的网络状态,通过监听来获取最新的网络类型,并动态调整网络超时的时间

NetworkUtils 类

NetworkType类

CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。

电量优化

1、(BroadCastReceiver)为了减少应用耗损的电量,我们在代码中尽量避免使用无用的操作代码,当应用退到后台了,一切页面的刷新都是没有意义的,并且浪费电,比如有个监听网络状态的广播并执行一些动作,弹窗或者是Toast,那么app需要在后台的时候,禁用掉这个功能,

2、数据传输 蓝牙传输,Wi-Fi传输 移动网络传输 后台数据的管理:根据业务需求,接口尽量避免无效数据的传输 数据传输的频度问题:通过经验值或者是数据统计的方法确定好数据传输的频度,避免冗余重复的数据传输,数据传输过程中要压缩数据的大小,合并网络请求,避免轮询

3、位置服务 正确的使用位置复位,是应用耗电的一个关键

需要注意以下的三点:

1、有没有及时注销位置监听器:和广播差不多

2、位置更新监听频率的设定;更加业务需求设置一个合理的更新频率值,

minTime:用来指定间更新通知的最小的时间间隔,单位是毫秒,看日志这里是1s更新的

minDistance:用来指定位置更新通知的最小的距离,单位是米

3、Android提供了三种定位

GPS定位,通过GPS实现定位,精度最高,通常在10米(火星坐标),但是GPS定位在时间和电量上消耗也是最高的

网络定位,通过移动通信的基站信号差异来计算出手机所在的位置,精度比GPS差好多

被动定位,最省电的定位服务,如果使用被动定位服务。说明它想知道位置更新信息但有不主动获取,等待手机中其他应用或者是服务或者是系统组件发出定位请求,并和这些组件的监听器一起接收位置的信息,实际的开发中,一般使用的是第三方的地图,高德,腾讯,百度,他们做了很好的封装,同时在地图上的表现上更加的优化

在OnDestroy 变量手动值为null,我在测试过程中,只有在值为null的时候这个位置监听才会停止,有兴趣的小伙伴,可以好好看看值为null,底层会做什么操作

WakeLock 是为了保持设备的唤醒状态的API,组织用户长时间不用,仍然需要组织设备进入休眠的状态,比如用户在看电影的时候。使用wakelock 时,需要及时的释放锁,比如播放视屏的时候WakeLock保持屏幕的常亮,在暂停的时候就应该释放锁,而不是等到停止播放才释放。

AlarmManager 也是比较耗电的,通常情况下需要保证两次唤醒操作的时间间隔不要太短了,在不需要使用唤醒功能的情况下,尽早的取消唤醒功能,否则应用会一直消耗电量 AlarmManager 是SDK提供的一个唤醒的APi,是系统级别的服务,可以在特定的时刻广播一个指定的Intent,这个pendingIntent可以用来启动Activity、Service、BroadcastReceiver, app,在后台也会启动

提供一个Demo,当app崩溃了,通过AlarmManager来重启App的功能

程序会重新启动,如果点击电量优化,App崩溃了,请给与全部权限,还要在开发者模式里面给与位置信息模拟的设置,如果崩溃了, 你也可以发现app会自动的重新启动,这是AlarmManager的应用,注意看MyApplication里面的代码,tks

以上就是个人总结的基本,总结的不太全面,同时也不太详细,如果可以的话,还请给个小星星,表示鼓励,谢谢了。

git地址:

https://github.com/Shimingli/PerformanceOptimizationForAndroid

ABOUT US

开发 · 干货 · 生活

带你了解IT世界的根源

投稿/合作wechat:yx1994119

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180612B0K49600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券