电量优化与网络优化

 一:Doze低电耗模式

 
未充电、屏幕熄灭、让设备在一段时间内保持不活动状态。
延迟应用的后台 CPU 和网络活动,从而降低耗电量
 

二:Standby待机模式

 应用待机模式会延迟用户近期未与之交互的应用的后台网络活动。

三:白名单

系统提供了一个可配置的白名单,将部分免除低电耗模式和应用待机模式优化的应用列入其中。 在低电耗模式 和应用待机模式期间,列入白名单的应用可以使用网络并保留部分唤醒锁定

四:获取充电状态

我们可以通过检查电池状态以及电量来判断是否进行某些操作。比如我们可
以在充电时才进行一些数据上报之类的操作。

  public static void checkBattery(Context context) {
        IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        Intent batteryStatus = context.registerReceiver(null, ifilter);

        // 是否正在充电
        int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                status == BatteryManager.BATTERY_STATUS_FULL;

        // 什么方式充电?
        int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        //usb
        boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
        //充电器
        boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;

        //获得电量
        int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
        int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
        float batteryPct = level * 100 / (float) scale;

        Log.e(TAG, "isCharging: " + isCharging + "  usbCharge: " + usbCharge + "  acCharge:" + acCharge);
        Log.e(TAG, "当前电量: " + batteryPct);
    }

五:监控充电状态变化

public class MainActivity extends AppCompatActivity {
 private PowerConnectionReceiver register;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.AppTheme);
        super.onCreate(savedInstanceState);

     //注册电量监听
        register = BatteryUtils.register(this);
}

@Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(register);
    }

}
public class BatteryUtils {

/**
     *  注册广播监听电量的变化
     * */
    public static PowerConnectionReceiver register(Context context) {
        //注册广播
        IntentFilter ifilter = new IntentFilter();
        //充电状态
        ifilter.addAction(Intent.ACTION_POWER_CONNECTED);
        ifilter.addAction(Intent.ACTION_POWER_DISCONNECTED);
        //电量显著变化
        ifilter.addAction(Intent.ACTION_BATTERY_LOW);//电量不足
        ifilter.addAction(Intent.ACTION_BATTERY_OKAY); //电量从低变回高
        PowerConnectionReceiver powerConnectionReceiver = new PowerConnectionReceiver();
        context.registerReceiver(powerConnectionReceiver, ifilter);
        return powerConnectionReceiver;
    }



}
/**
 *  监听电量变化的广播
 * 
 * */
public class PowerConnectionReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) {
            Toast.makeText(context, "充电状态:CONNECTED", Toast.LENGTH_SHORT).show();
        } else if (intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)) {
            Toast.makeText(context, "充电状态:DISCONNECTED", Toast.LENGTH_SHORT).show();
        } else if (intent.getAction().equals(Intent.ACTION_BATTERY_LOW)) {
            Toast.makeText(context, "电量过低", Toast.LENGTH_SHORT).show();
        } else if (intent.getAction().equals(Intent.ACTION_BATTERY_OKAY)) {
            Toast.makeText(context, "电量从低变回高", Toast.LENGTH_SHORT).show();
        }
    }
}

六: Battery Historian   是个检测手机随时间变化耗电量变化的可视化工具。可以帮助您诊断和识别应用存在的耗电问题。

Battery Historian可以帮助我们查看应用是否具有以下耗电行为:
过于频繁地触发唤醒提醒(至少每 10 秒钟一次)。 
持续保留 GPS 锁定。
至少每 30 秒调度一次作业。
至少每 30 秒调度一次同步。
使用手机无线装置的频率高于预期

七:Energy Profiler

Energy Profiler 可以了解应用在哪里耗用了不必要的电量。 Energy
Profiler 会监控 CPU 、网络无线装置和 GPS 传感器的耗电使用情况,并直观地显示其中每个组件消耗的电量。还会显
示可能会影响耗电量的系统事件(唤醒锁定、闹钟、作业和位置信息请求)的发生次数。

八:网络优化

正常一条网络请求需要经过的流程是这样:

第一步:DNS 解析,请求 DNS 服务器,获取域名对应的 IP 地址;
第二步:与服务端建立连接,包括 tcp 三次握手,安全协议同步流程;
第三步:连接建立完成,发送和接收数据,解码数据。
通过以上三步我们知道为了节省耗电量需要对以上三步进行优化:

八一:DNS优化:直接使用 IP 地址请求服务器,去除 DNS 解析步骤,不耗电省时高效;

DNSDomain Name System):把域名解析成IP地址,进行服务器访问。

  DNS的缺点:

  DNS 完整的解析流程过程过长繁琐;
  DNS的缓存时间设置不好控制,缓存时间设置过长,导致域名更新不及时,设置缓存时间过段,解析频繁,影响请求速度;
DNS域名容易劫持,不安全;
一次请求只能解析一个域名;

解决办法:

使用HTTPDNS请求,   直接通过IP地址,      直接请求后台服务器的地址,   不用向 向本地运营商询问域名解析的过程,避免了劫持问题,请求速度快,一次请求可以解析多个域名,同时也解决了DNS解析耗电的问题。

八二:连接优化: 使用复用连接(keep-alive)(长连接),不要每次请求都重新建立连接;

  优化具体方案:

   使用HTTP2协议 请求, 支持多路复用链接,。即支持同时处理多条并行发送请求,所有请求都可以在这条连接上并发进行请求,不用建立多条请求连接。

Android 的开源网络库OKhttp默认就会开启keep-alive多路复用链接,支持HTTP2.0

HTTP1.1 与HTTP2.0的区别

HTTP1.1 每次请求都需要进行三次握手建立连接耗时,每次请求完毕,连接就会关闭,一次连接 只能进行一次请求操作。

  HTTP2协议 请求, 支持多路复用链接,即支持同时处理多条并行发送请求,所有请求都可以在这条连接上并发进行请求,不用建立多条请求连接。

八三:开启 压缩数据优化:减小传输的数据大小,提升请求速度

在OKhttp的BridgeInterceptor桥接拦截器中会默认自动为我们开启gzip解压的支持

booleantransparentGzip=false;
if(userRequest.header("Accept-Encoding")==null&&userRequest.header("Range")==null){
transparentGzip=true;
requestBuilder.header("Accept-Encoding","gzip");
}

  九: 其他优化

1 、使用 webp 代替 png/jpg

2 、不同网络环境下载不同图片资源。
     

如(对于原图是300x300的图片):
2/3G使用低清晰度图片:使用100X100的图片;
4G再判断信号强度为强则使用使用300X300的图片,为中等则使用200x200,信号弱则使用100x100图片;
WiFi网络:直接下发300X300的图片

3http开启缓存 / 首页数据加入缓存

猜你喜欢

转载自blog.csdn.net/qq_33552379/article/details/119922733