Android7.0 BatteryService

BatteryService与PMS之间的关系比较密切,提供接口用于获取电池信息、充电状态等。
为了对Android的功耗控制有更深入的了解,我们有必要分析一下BatteryService。

一、启动过程
BatteryService与系统中的许多服务一样,是由SystemServer启动的。
我们一起看看SystemServer中相关的代码:

..............
//PMS是在startBootstrapServices中创建的
startBootstrapServices();
//BatteryService在startCoreServices中创建的
startCoreServices();
..............

跟进一下startCoreServices:

private void startCoreServices() {
    mSystemServiceManager.startService(BatteryService.class);
    ..................
}

之前的博客分析过SystemServiceManager的startService方法。
该方法主要通过反射的方式创建出对应的服务,
然后,将服务保存在SystemServiceManager的mServices变量中,
最后,调用服务对应的onStart方法。

我们不再赘述SystemServiceManager固有启动服务的流程,直接来看看本篇博客的主角BatteryService相关的代码。

1、BatteryService的构造函数

public BatteryService(Context context) {
    super(context);

    mContext = context;
    mHandler = new Handler(true /*async*/);

    //内部类Led,控制不同电量下led灯的颜色
    mLed = new Led(context, getLocalService(LightsManager.class));

    //电量统计服务
    mBatteryStats = BatteryStatsService.getService();

    //以下是根据配置文件,定义不同电量对应的等级

    //电池危急的电量;当电池电量低于此值时,将强制关机
    mCriticalBatteryLevel = mContext.getResources().getInteger(
            com.android.internal.R.integer.config_criticalBatteryWarningLevel);

    //低电警告的电量;当电池电量低于此值时,系统报警,例如闪烁LED灯等
    mLowBatteryWarningLevel = mContext.getResources().getInteger(
            com.android.internal.R.integer.config_lowBatteryWarningLevel);

    //关闭低电警告的电量;当电池电量高于此值时,结束低电状态,停止警示灯
    mLowBatteryCloseWarningLevel = mLowBatteryWarningLevel + mContext.getResources().getInteger(
            com.android.internal.R.integer.config_lowBatteryCloseWarningBump);

    //这里定义的不再是电量,而是关闭电池的温度(温度失控,就会出现三星S7爆炸啥的......)
    mShutdownBatteryTemperature = mContext.getResources().getInteger(
            com.android.internal.R.integer.config_shutdownBatteryTemperature);

    // watch for invalid charger messages if the invalid_charger switch exists
    // 监控终端是否连接不匹配的充电器
    if (new File("/sys/devices/virtual/switch/invalid_charger/state").exists()) {
        UEventObserver invalidChargerObserver = new UEventObserver() {
            @Override
            public void onUEvent(UEvent event) {
                final int invalidCharger = "1".equals(event.get("SWITCH_STATE")) ? 1 : 0;
                synchronized (mLock) {
                    if (mInvalidCharger != invalidCharger) {
                        mInvalidCharger = invalidCharger;
                    }
                }
            }
        };
        invalidChargerObserver.startObserving(
                "DEVPATH=/devices/virtual/switch/invalid_charger");
    }
}

从上面的代码可以看出,整体来看BatteryService构造函数是比较简单的,主要的目的就是得到一些变量。

2、onStart函数
接下来我们看看BatteryService的onStart函数:

public void onStart() {
    //获取电源属性服务的BinderProxy对象
    //电源属性服务运行在android的healthd进程中
    //对应文件为system/core/healthd/BatteryPropertiesRegistrar.cpp
    //这个写法确实很风骚,java层通过Binder直接与native层通信
    IBinder b = ServiceManager.getService("batteryproperties");
    final IBatteryPropertiesRegistrar batteryPropertiesRegistrar =
            IBatteryPropertiesRegistrar.Stub.asInterface(b);
    try {
        //向电源属性服务注册一个回调接口
        //当电源属性发生变化时,BatteryListener的batteryPropertiesChanged函数将被调用
        batteryPropertiesRegistrar.registerListener(new BatteryListener());
    } catch (RemoteException e) {
        // Should never happen.
    }

    mBinderService = new BinderService();
    //与PMS等很多系统服务一样,将自己注册到service manager进程中
    publishBinderService("battery", mBinderService);

    //之前介绍PMS时,提到过这个函数
    //对于基于LocalServices管理的对象而言,这个函数调用相当于单例模式的进阶版
    //以后BatteryManagerInternal接口类型的对象,只能有BatteryService的内部类LocalService一个
    publishLocalService(BatteryManagerInternal.class, new LocalService());
}

从以上代码可以看出,BatteryService在onStart函数中主要完成一些服务注册、接口注册的工作。

2.1 BatteryPropertiesRegistrar服务
我们看看BatteryPropertiesRegistrar.h的定义:

.......
namespace android {

class BatteryPropertiesRegist
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值