BatteryService服务分析

本文详细分析了Android系统服务BatteryService的启动流程,包括构造方法、onStart、onBootPhase以及processValuesLocked方法。重点在于如何跟踪电池状态、注册底层电量变化回调、更新电池信息以及处理电量警告级别。同时,探讨了BatteryStats.setBatteryState方法,用于记录电池状态和电量变化,并在电量达到特定阈值时触发相应操作,如LED指示灯颜色变化。整个流程以流程图的形式进行了总结。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BatteryService是在systemServer启动核心服务的时候启动的。

同样我们按照PMS启动的流程来分析BatteryService的启动流程。

1.BatteryService的构造方法

BatteryService的构造方法比较简单,只是从资源中获取一些预定的值

电量统计服务
mBatteryStats = BatteryStatsService.getService();
        //电池危急电量
        mCriticalBatteryLevel = mContext.getResources().getInteger(
                com.android.internal.R.integer.config_criticalBatteryWarningLevel);
        //电池低电量模式警告电量
        mLowBatteryWarningLevel = mContext.getResources().getInteger(
                com.android.internal.R.integer.config_lowBatteryWarningLevel);
        //关闭低电量模式警告电量
        mLowBatteryCloseWarningLevel = mLowBatteryWarningLevel + mContext.getResources().getInteger(
                com.android.internal.R.integer.config_lowBatteryCloseWarningBump);
        //电池关机温度
        mShutdownBatteryTemperature = mContext.getResources().getInteger(
                com.android.internal.R.integer.config_shutdownBatteryTemperature);

2.BatteryService onStart方法

onStart方法中 将BatteryService服务注册到ServiceManager,注册了底层电量变换的回调方法,最终调用BatteryService的update方法更新电池信息

public void onStart() {
        IBinder b = ServiceManager.getService("batteryproperties");
        final IBatteryPropertiesRegistrar batteryPropertiesRegistrar =
                IBatteryPropertiesRegistrar.Stub.asInterface(b);
        try {
            //注册底层电量变化的监听,调用update更新电池信息
            batteryPropertiesRegistrar.registerListener(new BatteryListener());
        ……
        //注册BatteryService服务
        publishBinderService("battery", new BinderService());
        publishLocalService(BatteryManagerInternal.class, new LocalService());
    }

3.onBootPhase方法

当ActivityManager启动完成的时候,回调onBootPhase方法

onBootPhase方法很简单,就是注册了一个关于ContentObserver

来监测设置中关于低电量警告的电量值是否改变

如果该电量值发生变化,回调updateBatteryWarningLevelLocked()方法。

 private void updateBatteryWarningLevelLocked() {
        final ContentResolver resolver = mContext.getContentResolver();
        //获取默认的警告电量值
        int defWarnLevel = mContext.getResources().getInteger(
                com.android.internal.R.integer.config_lowBatteryWarningLevel);
        //获取自己设置的警告电量值
        mLowBatteryWarningLevel =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值