android 耗电优化 笔记

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

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

ini 复制代码
  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);
  }

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

scss 复制代码
    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中我们可以。

scss 复制代码
    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

相关推荐
北京自在科技2 小时前
谷歌安卓 Gemini 迎来界面改版,Find Hub 接入 Gemini 支持物品记忆查找
android·安卓
YB13754 小时前
Jetpack Compose 动画Modifier.animateItem()
android
2401_885885045 小时前
巴林语音通知接口如何对接?系统告警语音API接入教程
android·前端·网络·python·语音识别
收纳过往6 小时前
数据库加索引的时机:慢查询日志说话
android·开发语言·数据库·python·低代码·rxjava
狂热开发者7 小时前
车载中控要给鸿蒙用户,能不能和 Android 共用一个二维码?
android·华为·harmonyos
.Bryce.7 小时前
T2-LLM评测不等于Agent评测
android·java·人工智能·后端·gpt·agent·1024程序员节
美狐美颜SDK开放平台8 小时前
视频美颜SDK如何应对快速转头与大幅度面部动作?
android·人工智能·ios·音视频·直播美颜sdk·视频美颜sdk
2601_968900778 小时前
玻璃深加工的工艺窗口:4 道工序的温度与时间参数边界
android·java·javascript
好的佩奇019 小时前
Dart 之类修饰符
android·flutter·dart
YB13759 小时前
Jetpack Compose 动画Modifier.animateContentSize()
android