概述
BatteryService负责监听充电状态和电量变化,当电量值或者充电类型改变时,会获取到底层healthd上报的电池状态信息,并更新到BatteryStatsService
中进行统计,同时会将这些值存储到Intent中,以广播的形式发送到监听了ACTION_BATTERY_CHANGED
的组件中,其他组建可以通过Intent.getExtra()的方式获取到电池信息。
1.BatteryService的启动流程
BatteryService继承于SyetemService,SyetemService是所有系统服务的基类,每个SyetemService的启动流程都具有相同的步骤,他们实现并重写其父类方法。因此,在分析BatteryService之前,先看看SystemServer的启动相关方法。SystemServer启动时调用方法如下,并且都是在SystemServer的main线程中运行:
- 1.
Constructor()
:构造方法,通过反射的方式调用; - 2.
onStart()
:开始运行服务; - 3.
onBootPhase(int)
:该方法表示启动阶段,会根据不同的参数(阶段)调用多次,直到PHASE_BOOT_COMPLETED
阶段调用后不再调用,表示启动完成,对于每个阶段,可以完成特定的工作;
了解了上述内容后,着手分析BatteryService就容易多了,首先,BatteryService会在SystemServer中进行启动:
/**
* The main entry point from zygote.
*/
public static void main(String[] args) {
new SystemServer().run();
}
启动SystemServer后,在main()函数中调用了run()方法,在run()方法中,启动三种服务:
private void run() {
......
// Start services.
try {
//启动引导服务
startBootstrapServices();
//启动核心服务
startCoreServices();
//启动其他服务
startOtherServices();
//关闭启动线程池
SystemServerInitThreadPool.shutdown();
......
} catch (Throwable ex) {
throw ex;
} finally {
traceEnd();
}
}
startBootstrapServices()
中启动的是一些依赖性比较高的系统服务(所以方法名为"引导服务"),如PMS就是在这里进行启动的。
startCoreServices()
中启动一些核心服务,从代码中看,启动的核心服务有四种,其中就包括要分析的BatteryService。
startOtherServices()
用来启动其他的一些服务。
在startCoreServices()
中,通过SystemServiceManager中的方法,传入类名作为参数,利用反射机制对BatteryService进行实例化:
public <T extends SystemService> T startService(Class<T> serviceClass) {
try {
final String name = serviceClass.getName();
......
final T service;
try {
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
} catch (InstantiationException ex)
}
startService(service);
return service;
} finally {
}
}
public void startService(@NonNull final SystemService service) {
// Register it.
mServices.add(service);
long time = SystemClock.elapsedRealtime();
try {
//调用onStart()方法开启服务
service.onStart();
} catch (RuntimeException ex) {
}
}
分析到这一步,SystemServive的生命周期方法就剩下onBootPhase()
方法了,这个方法也说过了,是负责启动启动服务的过程中分阶段进行一些工作的,也运行在SystemServer的main线程中:
private void startOtherServices() {
......
mSystemServiceManager.startBootPhase(
SystemService.PHASE_LOCK_SETTINGS_READY);
mSystemServiceManager.startBootPhase(
SystemService.PHASE_SYSTEM_SERVICES_READY);
mSystemServiceManager.startBootPhase(
SystemService.PHASE_ACTIVITY_MANAGER_READY);
mSystemServiceManager.startBootPhase(
SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
mSystemServiceManager.startBootPhase(
SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
......
}
SystemServiceManager
中:
public void startBootPhase(final int phase) {
......
mCurrentPhase = phase;
try {
final int serviceLen = mServices.size();
for (int i = 0; i < serviceLen; i++) {
final SystemService service = mServices.get(i);
long time = SystemClock.elapsedRealtime();
try {
service.onBootPhase(mCurrentPhase);
} catch (Exception ex) {
}
}