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
<code class="hljs lasso has-numbering"><span class="hljs-comment">//这里持锁,意味者内部所有函数必须在规定事件内执行完毕</span>
<span class="hljs-comment">//否则watchDog将会检测到错误</span>
synchronized (mLock) {
mSystemReady <span class="hljs-subst">=</span> <span class="hljs-literal">true</span>;
mAppOps <span class="hljs-subst">=</span> appOps;
<span class="hljs-comment">//注意下面的对象都是从LocalServices取出的,从之前PMS加入LocalServices的流程来看</span>
<span class="hljs-comment">//下面取出的实际上应该是继承抽象类的实际子类</span>
<span class="hljs-comment">//因此大概可以理解LocalServices的作用了,以抽象类名为key,保存实际的子类</span>
<span class="hljs-comment">//以key取出子类对象时,子类退化为抽象类,于是得到了实际对象,但仅能利用父类的接口</span>
<span class="hljs-comment">//整个设计演变为面向接口的编程</span>
<span class="hljs-comment">//从注释来看,与doze有关</span>
mDreamManager <span class="hljs-subst">=</span> getLocalService(DreamManagerInternal<span class="hljs-built_in">.</span>class);
<span class="hljs-comment">//显示管理相关</span>
mDisplayManagerInternal <span class="hljs-subst">=</span> getLocalService(DisplayManagerInternal<span class="hljs-built_in">.</span>class);
<span class="hljs-comment">//Window管理相关</span>
mPolicy <span class="hljs-subst">=</span> getLocalService(WindowManagerPolicy<span class="hljs-built_in">.</span>class);
<span class="hljs-comment">//电源管理相关</span>
mBatteryManagerInternal <span class="hljs-subst">=</span> getLocalService(BatteryManagerInternal<span class="hljs-built_in">.</span>class);
<span class="hljs-comment">//这里获取PowerManager就是为了方便获取下面三个系统属性</span>
PowerManager pm <span class="hljs-subst">=</span> (PowerManager) mContext<span class="hljs-built_in">.</span>getSystemService(Context<span class="hljs-built_in">.</span>POWER_SERVICE);
mScreenBrightnessSettingMinimum <span class="hljs-subst">=</span> pm<span class="hljs-built_in">.</span>getMinimumScreenBrightnessSetting();
mScreenBrightnessSettingMaximum <span class="hljs-subst">=</span> pm<span class="hljs-built_in">.</span>getMaximumScreenBrightnessSetting();
mScreenBrightnessSettingDefault <span class="hljs-subst">=</span> pm<span class="hljs-built_in">.</span>getDefaultScreenBrightnessSetting();
<span class="hljs-comment">//Sensor相关</span>
SensorManager sensorManager <span class="hljs-subst">=</span> <span class="hljs-literal">new</span> SystemSensorManager(mContext, mHandler<span class="hljs-built_in">.</span>getLooper());
<span class="hljs-comment">//系统电量统计有关</span>
mBatteryStats <span class="hljs-subst">=</span> BatteryStatsService<span class="hljs-built_in">.</span>getService();
<span class="hljs-comment">// The notifier runs on the system server's main looper so as not to interfere</span>
<span class="hljs-comment">// with the animations and other critical functions of the power manager.</span>
mNotifier <span class="hljs-subst">=</span> <span class="hljs-literal">new</span> Notifier(Looper<span class="hljs-built_in">.</span>getMainLooper(), mContext, mBatteryStats,
mAppOps, createSuspendBlockerLocked(<span class="hljs-string">"PowerManagerService.Broadcasts"</span>),
mPolicy);
<span class="hljs-comment">//无线充电检测相关</span>
mWirelessChargerDetector <span class="hljs-subst">=</span> <span class="hljs-literal">new</span> WirelessChargerDetector(sensorManager,
createSuspendBlockerLocked(<span class="hljs-string">"PowerManagerService.WirelessChargerDetector"</span>),
mHandler);
mSettingsObserver <span class="hljs-subst">=</span> <span class="hljs-literal">new</span> SettingsObserver(mHandler);
<span class="hljs-comment">//lightService相关</span>
mLightsManager <span class="hljs-subst">=</span> getLocalService(LightsManager<span class="hljs-built_in">.</span>class);
mAttentionLight <span class="hljs-subst">=</span> mLightsManager<span class="hljs-built_in">.</span>getLight(LightsManager<span class="hljs-built_in">.</span>LIGHT_ID_ATTENTION);
<span class="hljs-comment">// Initialize display power management.</span>
<span class="hljs-comment">//调用DisplayManagerService内部的LocalService的函数</span>
<span class="hljs-comment">//创建出DisplayBlanker和DisplayPowerController</span>
mDisplayManagerInternal<span class="hljs-built_in">.</span>initPowerManagement(
mDisplayPowerCallbacks, mHandler, sensorManager);
<span class="hljs-comment">//定义一堆BroadcastReceiver</span>
<span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span>
<span class="hljs-comment">//利用mSettingsObserver监听一堆数据库字段的变化</span>
<span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span>
<span class="hljs-comment">//VR相关</span>
IVrManager vrManager <span class="hljs-subst">=</span>
(IVrManager) getBinderService(VrManagerService<span class="hljs-built_in">.</span>VR_MANAGER_BINDER_SERVICE);
try {
vrManager<span class="hljs-built_in">.</span>registerListener(mVrStateCallbacks);
} catch (RemoteException e) {
Slog<span class="hljs-built_in">.</span>e(<span class="hljs-built_in">TAG</span>, <span class="hljs-string">"Failed to register VR mode state listener: "</span> <span class="hljs-subst">+</span> e);
}
<span class="hljs-comment">//从资源文件中读取大量配置信息</span>
readConfigurationLocked();
<span class="hljs-comment">//读取数据库字段,保存到本地变量中</span>
<span class="hljs-comment">//必要时会进行一些实际的操作,例如设置feature到native层的动态库</span>
updateSettingsLocked();
mDirty <span class="hljs-subst">|=</span> DIRTY_BATTERY_STATE;
<span class="hljs-comment">//更新全局的电源状态</span>
updatePowerStateLocked();
}</code>
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