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

相关推荐
ANYOUZHEN6 小时前
bugku shell
android
南宫码农9 小时前
我的电视 - Android原生电视直播软件 完整使用教程
android·开发语言·windows·电视盒子
道亦无名10 小时前
音频数据特征值提取 方法和步骤
android·音视频
Lancker10 小时前
定制侠 一个国产纯血鸿蒙APP的诞生过程
android·华为·智能手机·鸿蒙·国产操作系统·纯血鸿蒙·华为鸿蒙
2601_9498095911 小时前
flutter_for_openharmony家庭相册app实战+通知设置实现
android·javascript·flutter
液态不合群12 小时前
【面试题】MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?
android·数据库·mysql
雪球Snowball13 小时前
【Android关键流程】资源加载
android
2501_9159184114 小时前
常见 iOS 抓包工具的使用,从代理抓包、设备抓包到数据流抓包
android·ios·小程序·https·uni-app·iphone·webview
墨月白15 小时前
[QT]QProcess的相关使用
android·开发语言·qt
enbug16 小时前
编译安卓内核:以坚果R1、魔趣MK100(Android 10)系统为例
android·linux