Android 8.1 Battery系列(二) BatteryStatsService分析

概述

BatteryStatsService负责电池信息的收集,以及各个部分耗电量的统计,它继承于IBatteryStats.Stub,因此可以通过Binder机制和其他组件进行交互。在上一节中分析过BatteryService,它负责监听从底层传上来的电量信息,当有数据时,BatteryService会将数据传给BatteryStatsService,BatteryStatsService中所有功能最终又委托给BatteryStatsImpl去处理。

和BatteryService不同的是,BatteryStatsService并非继承于SystemService,因此不是一个SystemService类,不具有SystemService的生命周期方法。

BatteryStatsService的启动、初始化和发布都是在AMS中进行,当SystemServer启动AMS后,AMS在其构造方法中启动了BSS,同时AMS在后续调用中进行了BSS的注册,下面一一进行分析!

1.实例化

在AMS中,获取BatteryStatsService实例方式如下:

public ActivityManagerService(Context systemContext) {
   
    ......
    // TODO: Move creation of battery stats service outside of activity manager service.
    File dataDir = Environment.getDataDirectory();
    File systemDir = new File(dataDir, "system");
    //创建/data/system目录
    systemDir.mkdirs();
    //实例化BatteryStatsService
    mBatteryStatsService = new BatteryStatsService(systemContext, systemDir, mHandler);
    //从/data/system/batterystas-daily.xml中读取信息
    mBatteryStatsService.getActiveStatistics().readLocked();
    //使用ExecutorService线程池将BatteryStatsImpl中统计的电池信息写入硬盘中 
    mBatteryStatsService.scheduleWriteToDisk();
    mOnBattery = DEBUG_POWER ? true
            : mBatteryStatsService.getActiveStatistics().getIsOnBattery();
    //设置BatteryCallback接口
    mBatteryStatsService.getActiveStatistics().setCallback(this);
}

setCallback()方法设置了BatteryCallback回调,该接口如下:

public interface BatteryCallback {
   
    public void batteryNeedsCpuUpdate();
    public void batteryPowerChanged(boolean onBattery);
    public void batterySendBroadcast(Intent intent);
}

该接口负责当对应条件符合时,在Handler中调用此方法通知AMS,从而在AMS中进行回调这三个方法在AMS中的实现.

1.1.BatteryStatsService.Constructor()

按照上面的调用顺序,我们先看BatteryStatsService的构造方法:

BatteryStatsService(Context context, File systemDir, Handler handler) {
   
    //这里传入来自AMS中的Handler,并通过handler.getLooper()获取到AMS中的Looper
    mContext = context;
    //BSI中一个内部类,可以通过UserManagerInternal获取UserId
    mUserManagerUserInfoProvider = new BatteryStatsImpl.UserInfoProvider() {
   
        private UserManagerInternal umi;
        @Override
        public int[] getUserIds() {
   
            if (umi == null) {
   
                umi = LocalServices.getService(UserManagerInternal.class);
            }
            return (umi != null) ? umi.getUserIds<
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值