概述
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<