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

相关推荐
ao-weilai1 小时前
MySQL数据库:内置函数
android·数据库·mysql
SWAGGY..1 小时前
【C++进阶】:(7)红黑树的原理与 C++ 实现:结构设计、插入调整及性质验证
android·java·开发语言·c++·算法
Android打工仔1 小时前
CoroutineScheduler 设计解析(上)—— 为什么 Dispatchers.IO 会创建更多线程?
android·kotlin·源码阅读
martindelophy3 小时前
用自然语言剪视频:我们在 Timeline Studio 中实现了 ChatCut 对话剪辑
android·音视频
ao-weilai3 小时前
MySQL数据库:复合查询
android·数据库·mysql
三少爷的鞋16 小时前
AI 时代,我们都将成为通才型开发者:只懂 Android,已经不够了
android
Dovis(誓平步青云)20 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
晚风叙码1 天前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
传奇开心果编程1 天前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程1 天前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer