一:Doze低电耗模式
二: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 是个检测手机随时间变化耗电量变化的可视化工具。可以帮助您诊断和识别应用存在的耗电问题。
七:Energy Profiler
八:网络优化
正常一条网络请求需要经过的流程是这样:
八一:DNS优化:直接使用 IP 地址请求服务器,去除 DNS 解析步骤,不耗电省时高效;
DNS(Domain Name System):把域名解析成IP地址,进行服务器访问。
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");
}
九: 其他优化
如(对于原图是300x300的图片):
2/3G使用低清晰度图片:使用100X100的图片;
4G再判断信号强度为强则使用使用300X300的图片,为中等则使用200x200,信号弱则使用100x100图片;
WiFi网络:直接下发300X300的图片
3、http开启缓存 / 首页数据加入缓存