android 耗电优化 笔记

25 阅读1分钟

Android系统对程序的耗电进行统计的功能大致原理就是,根据不同模块,定义不同计算规则,结合power_profile.xml文件下厂商自己定义的每个模块的功耗大小,进行统计计算的。

程序可以通过固定频率来采集总电量消耗,比如10min/次,然后上报服务器

  int beforeBattery = 0;
  void startBatteryUsageMonitor(){
      BatteryManager mBatteryManager = 
          (BatteryManager)context.getSystemService(Context.BATTERY_SERVICE);
       
      //调度线程池每隔10min执行1次电量统计任务
      ScheduledExecutorService.scheduleAtFixedRate(new Runnable() 
                @override
                public void run() {
                    int battery =mBatteryManager.getIntProperty(BatteryManager,BATTERy_PROPERTY CAPACITY);
                    if(beforeBattery != 0){
                   //当前电量的分位置减去10min前电量的分位置就是这个时间段的电量消耗
                   int batteryUsage = beforeBattery-battery;report(batteryUsage);
                )
                beforeBattery = battery;
         }, 0,10*60,TimeUnit.SECONDS);
  }

在手机充电时,放弃对耗电统计

    private BroadcastReceiver batteryReceiver = new BroadcastReceiver(){
            @override
            public void onReceive(Context context,Intent intent){
                String action = intent.getAction();
                //充电连接
                if(action.equals(Intent.ACTION_POWER_CONNECTED)){
                    //暂停统计
                    stopBatteryUsageMonitor();
                //充电断开    
                }else if(action.equals(Intent.ACTION_POWER_DISCONNECTED)){
                    startBatteryUsageMonitor();
                }
            }
    }

处于后台时也停止统计,在application中我们可以。

    int activityCount = 0 // 当前前台的activity数量
    registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks(){
        @override
        public void onActivityResume(Activity activity,Bundle saveInstanceState){
            if(activityCount  == 0){
              startBatteryUsageMonitor();
            }
            activityCount++;
        }
    
        @override
        public void onActivityPause(Activity activity){
            activityCount--;
            if(activityCount  == 0){
                //暂停统计
              stopBatteryUsageMonitor();
            }
            
        }
    
    })

其他:

合理运用JobScheduler 或 WorkManager 进行任务调度,合理运用JobService、ForegroundService