Android系统--PowerManagerService电源管理分析

PowerManagerService

代码参考:http://blog.csdn.net/iefswang/article/details/38701709 并加上自己的理解和补充

简介

PowerManagerService服务是Android系统的上层的电源管理服务,主要负责系统待机、屏幕背光、按键背光、键盘背光以及用户事件的处理。通过锁的申请与释放以及默认的待机时间来控制系统的待机状态;通过系统默认灭屏时间以及用户操作的事件状态控制背光亮、暗。该服务还包括了光线、距离传感器上层查询与控制,LCD亮度的调节最终也是由该服务完成。

PowerManagerService如何来进行电源管理,那就要有外部事件的时候去通知它,WindowManagerService会把用户的点击屏幕,按键等作为user activity事件来调用userActivity函数,PowerManagerService就会在userActivity里面判断事件类型作出反映,是点亮屏幕提供操作,还是完全不理会,或者只亮一下就关掉。

电源管理架构图如下:

 

开机启动及处理

当系统开启时,在SystemServer.java的run接口通过将power服务加入到系统服务中:

power = new PowerManagerService();

ServiceManager.addService(Context.POWER_SERVICE, power);

当光感服务与电池管理服务都开始后进行power服务的初始化:

// only initialize the power service after we have started the

// lights service, content providers and the battery service.

power.init(context, lights, ActivityManagerService.self(), battery,

          BatteryStatsService.getService(),

          ActivityManagerService.self().getAppOpsService(), display);


Init()接口实现一些基本的初始化工作,包括将lights和battery两个服务实例传入到power服务中,这两个服务将与power进行交互。另外,开启了两线程,其中有一个比较重要的线程后期用于处理亮度动画的: 

mScreenBrightnessAnimator.start( );

mScreenBrightnessAnimator为PowerManagerService子类ScreenBrightnessAnimator的实例。

mHandlerThread = new HandlerThread("PowerManagerService")

mHandlerThread.start( );

另外一个PowerManagerService线程完成接下来的部分初始化工作。start后,会调用到run接口,并在其中回调到子类中的protected void onLooperPrepared()中,该接口又调用到initInThread( ),主要实现一些值的初始化,并标识mInitComplete = true;这时,mHandlerThread.notifyAll();通知mHandlerThread的Looper实例创建,该实例在systemReady( )接口中被SystemSensorManager(mHandlerThread.getLooper());使用。还有一个地方需要注意一个,在initThread中还实现了一个设置的监听:mSettings.addObserver(mSettingsObserver);如果用户在系统中变更了关于背光时间或是否启用光感等,PowerManagerService能获取到最新的状态值,通过update()进行更新。

  此外,在系统准备就绪后,systemservice.java中会调用power.systemReady( );该接口主要进行一些配置值的读取,如Lcd背光、键盘背光等数组配值。

当系统完全启动,即ActivityManagerService中的finishBooting()发出bootCompleted广播后:

broadcastIntentLocked(null, null, new Intent(Intent.ACTION_BOOT_COMPLETED, null),null, null, 0, null, null, android.Manifest.permission.RECEIVE_BOOT_COMPLETED, false, false, MY_PID, Process.SYSTEM_UID, Binder.getOrigCallingUser());

此时,PMS中会收到该广播BootCompletedReceiver,接收广播后进行处理

private void handleBootCompletedLocked() {

        final long now = SystemClock.uptimeMillis();

        mBootCompleted = true;

        mDirty |= DIRTY_BOOT_COMPLETED;

        userActivityNoUpdateLocked(

                now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0,              Process.SYSTEM_UID);  //好像是模拟触发一次按键事件件 

        updatePowerStateLocked(); //更新电源状态

}

 

和应用层交互:

在Android中应用程序并不是直接同PowerManagerService交互的,而是通过PowerManager间接地与PowerManagerService打交道。不过在使用PowerManager和PowerManager,WakeLock之前,我们要首先在APP中申请使用如下权限:

<uses-permission android:name = "android.permission.WAKE_LOCK" />

<uses-permission android:name = "android.permission.DEVICE_POWER"/>

而APP能够与PowerManager做哪些交互,我们可以看到PowerManage提供了如下公共的接口:

PowerManager

PowerManagerService

goToSleep(long time)

goToSleep(long eventTime, int reason)

isScreenOn()

isScreenOn()

reboot(String reason)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值