http://blog.csdn.net/gaugamela/article/details/52838654
Binderservice : IPowerManager.stub
Localservice : PowerManagerInternal
1、初始化
PMS是在systemserver的startBootstrapServices创建的
public static void main(String[] args) {
new SystemServer().run();
}
private void run() {
// Start services.
try {
startBootstrapServices();
startCoreServices();
startOtherServices();
}
}
(1)、mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);//startBootstrapServices();//PowerManagerService.onstart();
(2)、mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());// startOtherServices();
(1) PMS构造函数分析:
public PowerManagerService(Context context) {
super(context);
mContext = context;
mHandlerThread = new ServiceThread(TAG,
Process.THREAD_PRIORITY_DISPLAY, false /*allowIo*/);
mHandlerThread.start();//开启新的消息线程
mHandler = new PowerManagerHandler(mHandlerThread.getLooper());//独有的消息循环处理中心
synchronized (mLock) {
mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks");
mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display");
mDisplaySuspendBlocker.acquire();
mHoldingDisplaySuspendBlocker = true;
mHalAutoSuspendModeEnabled = false;
mHalInteractiveModeEnabled = true;
mWakefulness = WAKEFULNESS_AWAKE;
nativeInit();
nativeSetAutoSuspend(false);
nativeSetInteractive(true);
}
}
@Override
public void onStart() {
publishBinderService(Context.POWER_SERVICE, new BinderService());
publishLocalService(PowerManagerInternal.class, new LocalService());
Watchdog.getInstance().addMonitor(this);
Watchdog.getInstance().addThread(mHandler);
}
(2)、systemReady
//这里持锁,意味者内部所有函数必须在规定事件内执行完毕
//否则watchDog将会检测到错误
synchronized (mLock) {
mSystemReady =true;
mAppOps appOps;
//注意下面的对象都是从LocalServices取出的,从之前PMS加入LocalServices的流程来看
//下面取出的实际上应该是继承抽象类的实际子类
//因此大概可以理解LocalServices的作用了,以抽象类名为key,保存实际的子类
//以key取出子类对象时,子类退化为抽象类,于是得到了实际对象,但仅能利用父类的接口
//整个设计演变为面向接口的编程
//从注释来看,与doze有关
mDreamManager getLocalService(DreamManagerInternal.class);
//显示管理相关
mDisplayManagerInternal getLocalService(DisplayManagerInternal.class);
//Window管理相关
mPolicy getLocalService(WindowManagerPolicy.class);
//电源管理相关
mBatteryManagerInternal getLocalService(BatteryManagerInternal.class);
//这里获取PowerManager就是为了方便获取下面三个系统属性
PowerManager pm (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
mScreenBrightnessSettingMinimum pm.getMinimumScreenBrightnessSetting();
mScreenBrightnessSettingMaximum pm.getMaximumScreenBrightnessSetting();
mScreenBrightnessSettingDefault pm.getDefaultScreenBrightnessSetting();
//Sensor相关
SensorManager sensorManager = new SystemSensorManager(mContext, mHandler.getLooper());
//系统电量统计有关
mBatteryStats BatteryStatsService.getService();
// The notifier runs on the system server's main looper so as not to interfere
// with the animations and other critical functions of the power manager.
mNotifier = new Notifier(Looper.getMainLooper(), mContext, mBatteryStats,
mAppOps, createSuspendBlockerLocked("PowerManagerService.Broadcasts"),
mPolicy);
//无线充电检测相关
mWirelessChargerDetector = new WirelessChargerDetector(sensorManager,
createSuspendBlockerLocked("PowerManagerService.WirelessChargerDetector"),
mHandler);
mSettingsObserver = new SettingsObserver(mHandler);
//lightService相关
mLightsManager getLocalService(LightsManager.class);
mAttentionLight mLightsManager.getLight(LightsManager.LIGHT_ID_ATTENTION);
// Initialize display power management.
//调用DisplayManagerService内部的LocalService的函数
//创建出DisplayBlanker和DisplayPowerController
mDisplayManagerInternal.initPowerManagement(
mDisplayPowerCallbacks, mHandler, sensorManager);
//定义一堆BroadcastReceiver
....
//利用mSettingsObserver监听一堆数据库字段的变化
....
//VR相关
IVrManager vrManager
(IVrManager) getBinderService(VrManagerService.VR_MANAGER_BINDER_SERVICE);
try {
vrManager.registerListener(mVrStateCallbacks);
} catch (RemoteException e) {
Slog.e(TAG, "Failed to register VR mode state listener: " + e);
}
//从资源文件中读取大量配置信息
readConfigurationLocked();
//读取数据库字段,保存到本地变量中
//必要时会进行一些实际的操作,例如设置feature到native层的动态库
updateSettingsLocked();
mDirty |= DIRTY_BATTERY_STATE;
//更新全局的电源状态
updatePowerStateLocked();
}
2、对外接口(功能)
(1)、报告用户活动----userActivity
(2)、休眠模式---gotoSleep
3、WakeLock机制---休眠和唤醒
"/sys/android_power/acquire_partial_wake_lock" "/sys/android_power/release_wake_lock"
“/sys/power/wake_lock” “/sys/power/wake_unlock”
mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks");
mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display");
mDisplaySuspendBlocker.acquire();
上层的wakelock都是操作 updateSuspendBlockerLocked 里的mDisplaySuspendBlocker.acquire();和mDisplaySuspendBlocker.release();
DisplayPowerController:管理显示设备的power状态,主要功能是播放屏幕状态变化的动画,通过回调的方式和PowerManagerService交互
(Callbacks.onStateChange)PowerManagerService