PowerManagerServcie是android系统电源管理的核心服务,它在Framework层建立起一个策略控制方案,向下决策HAL层以及kernel层来控制设备待机状态,控制显示屏,背光灯,距离传感器,光线传感器等硬件设备的状态。向上提供给应用程序相应的操作接口,比如听音乐时持续保持系统唤醒,应用通知来临唤醒手机屏幕等场景等,PMS也是系统的核心服务,启动流程的时序图如下:
启动流程时序图
根据PowerManagerService的启动流程时序图,可以简单的将启动过程分为图中的几个步骤。
根据代码来详细分析
PowerManagerService是系统的核心服务,在SystemServer中启动。SystemServer在系统启动的时候会启动三种服务,引导关键服务,核心服务和其他服务。
startBootstrapServices(); //启动引导服务
startCoreServices();//启动核心服务
startOtherServices();//其他服务
在启动引导关键服务的方法中,创建PowerManagerService对象,并将它启动了起来
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
接着我们看下startService相关的代码实现。
public <T extends SystemService> T startService(Class<T> serviceClass) {
……
final T service;
try {
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
//构造PowerManangerService对象
} catch (InstantiationException ex) {
……
}
// Register it.
mServices.add(service); //将PowerManangerService添加到LocalService中
// Start it.
try {
service.onStart(); //调用PowerManagerService的onStart方法
} catch (RuntimeException ex) {
……
}
return service;
}
在startService方法中,利用反射方法构造PowerManagerService的对象,将它添加到本地service变量中,然后调用了PowerManagerService的onStart方法。
那么我们首先来分析PowerManagerService的构造方法,然后在分析PowerManagerService的onStart方法。
PowerManagerService的构造方法分析
public PowerManagerService(Context context) {
super(context);
mContext = context;
mHandlerThread = new ServiceThread(TAG,
Process.THREAD_PRIORITY_DISPLAY, false /*allowIo*/);
mHandlerThread.start();
//创建一个HandlerThread,并启动
mHandler = new PowerManagerHandler(mHandlerThread.getLooper());
//基于这个HandlerThread创建一个相关的Handler对象,用于向handlerThread中发送消息
synchronized (mLock) {
mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks");
//该WakeLock用于控制CPU
mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display");
//该wakeLock用于控制屏幕
mDisplaySuspendBlocker.acquire();
mHoldingDisplaySuspendBlocker = true;
mHalAutoSuspendModeEnabled = false;
mHalInteractiveModeEnabled = true;
mWakefulness = WAKEFULNESS_AWAKE;