PMS电源管理

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

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值