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