电池优化?按我说的一定能优化成功

      我觉得大部分程序员不会太在意电池优化这件事儿。因为耗电和产品需求或者设计有冲突的时候,99%的时候都是牺牲耗电量。所以我觉得电池优化最大的关键在于——沟通!你能说服产品改需求,或者是设计改设计稿,那你优化成功了。代码上的修改远不如他们需求与设计上的修改。

      我就列举下android5.0以来对电池方面做得优化以及,哪些API被改动了。

        

这上面比较重点的就是,请注意7.0以后隐式广播被移除了,意思就是你静态注册的广播,很多都收不到了,你需要动态注册。

不过有办法修改发送广播的地方,让静态广播能收到,但是注册的系统静态广播就收不到了。

以及6.0引入的低电耗模式,在这个模式下,你有的API可能会没法返回正确的值给你。我待会儿会举出几个。

这个是获取充电方式的方法,在低电耗模式会拿不到值。

//获取充电方式
public static boolean isPlugged(Context context){
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
        Intent intent=context.registerReceiver(null,intentFilter);
        int state=intent.getIntExtra(BatteryManager.EXTRA_PLUGGED,-1);
        boolean ac_power=state==BatteryManager.BATTERY_PLUGGED_AC;
        boolean usb_power=state==BatteryManager.BATTERY_PLUGGED_USB;
        boolean wire_power=state==BatteryManager.BATTERY_PLUGGED_WIRELESS;
        return ac_power||usb_power||wire_power;
    }

这个是获取充电状态值,可以在低电耗模式下拿到,所以我推荐用下面这个判断 

//获取是否充满/正在充电
public static boolean isPowerState(Context context){
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
        Intent intent=context.registerReceiver(null,intentFilter);
        int state=intent.getIntExtra(BatteryManager.EXTRA_STATUS,-1);

        boolean full_power=state==BatteryManager.BATTERY_STATUS_FULL;
        boolean charging_power=state==BatteryManager.BATTERY_STATUS_CHARGING;

        return full_power||charging_power;
    }

这个是申请添加应用到白名单的方法

//添加应用到白名单
    public static void addWhiteList(Activity activity){
        PowerManager powerManager= (PowerManager) activity.getSystemService(Context.POWER_SERVICE);
        if(!powerManager.isIgnoringBatteryOptimizations(activity.getPackageName())){
            Intent intent=new Intent( Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS );
            intent.setData(Uri.parse("package:"+activity.getPackageName()));
            activity.startActivity(intent);
        }
    }

上面是低功耗那次修改推荐使用的方法,下面那个实测,不会准时启动。 

//6.0以后用这个很准
alarmManager.setExactAndAllowWhileIdle();
//6.0以后用这个不知道什么时候会触发
alarmManager.setRepeating();

今天既然讲电量优化,总结我都写在开头了,代码上能做到的真的很有限。产品少来几个奇怪的需求,设计少来几个狂拽酷炫叼的动画,电量很经用的。我们又不是有病要让用户多耗电,我们也只是在做我们的工作。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章