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

相关推荐
摇滚侠41 分钟前
《SpringBoot 3:入门与应用实战》第 6 章 Spring Boot 最佳实践 阅读笔记 12
android·spring boot·笔记
mmsx1 小时前
Android 宠物健康服务平台实战:从架构设计到主题换肤完整解析(源码和文档)
android·架构·sqlite·app·源码·宠物
、如果1 小时前
ima Skills 自进化实战:三层结构、反馈与版本验证
android·人工智能·ai编程
hunterandroid2 小时前
自定义 View 绘制与触摸冲突:从滑动卡顿到事件分发闭环
android·前端
weixin_403810132 小时前
安卓自动化脚本 HID 硬件选购指南:蓝牙HID与OTG HID区别、成本与搭建教程
android·运维·自动化·hid·安卓自动化脚本·安卓中控
qq_316837752 小时前
uniapp 安卓/H5 使用 contentEditable 属性 富文本编辑器
android·javascript·uni-app
二流小码农2 小时前
鸿蒙开发:了解Context
android·ios·harmonyos
404_coder2 小时前
源码视角下的 Android 开机流程(三):从 Launcher Task 到 WindowState 挂载
android
又见情义3 小时前
RK3568 Android 13 移植 EC20-CE 4G 模块全记录
android·arm开发·驱动开发
网安蟹佬霸3 小时前
Android安全攻防实战:从APK逆向到Frida动态Hook全流程详解(附脚本)
android·前端·安全·web安全·逆向·csrf·网安