安卓面经PowerManagerService待机流程_12

牛客高级系列专栏:

安卓(安卓系统开发也要掌握)

嵌入式

  • 本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人从嵌入式Linux转Android系统开发过程中对常见安卓系统开发面试题的理解;
  • 1份外卖价格助您提高安卓面试准备效率,为您面试保驾护航!!

正文开始⬇

1 简介

PowerManagerServcie是android系统电源管理的核心服务,它在Framework层建立起一个策略控制方案,向下决策HAL层以及kernel层来控制设备待机状态,控制显示屏,背光灯,距离传感器,光线传感器等硬件设备的状态。向上提供给应用程序相应的操作接口,比如听音乐时持续保持系统唤醒,应用通知来临唤醒手机屏幕等场景等,PMS也是系统的核心服务,Android的电源管理主要是通过wakelock机制来管理系统的状态,整个android电源管理,可以分为如下四个层次:

1)应用接口层(PowerManager.java) PowerManager中开放给应用一系列接口,应用可以调用PM的接口申请wakelock,唤醒系统,或使系统进入睡眠等操作;

2)Framework层(PowerManagerService.java) 应用调用PowerManager开放的接口,来对系统进行一些列的操作是在PowerManagerService中完成的,PowerManagerService计算系统中和Power 相关的计算,是整个电源管理的决策系统。同时协调Power如何与系统其 它模块的交互,比如亮屏,暗屏,系统睡眠,唤醒等等;

3)HAL层(Power.c) 该层只有一个power.c文件,该文件通过上层传下来的参数,向/sys/power/wake_lock 或者/sys/power/wake_unlock文件节点写数据来与kernel进行通信,主要功能是申请/释放锁,维持屏幕亮灭;

4)内核层(kernel/Power) 内核层实现电源管理的方案主要包含三个部分:
(1)Kernel/power/:实现了系统电源管理框架机制;
(2)Arch/arm(ormips or powerpc)/mach-XXX/pm.c:实现对特定板的处理器电源管理;
(3)drivers/power:是设备电源管理的基础框架,为驱动提供了电源管理接口。

alt

系统准备工作

在PowerManagerService创建之后会调用systemReady做一些初始化相关的操作,获取与PowerManager相关的本地服务:

public void systemReady(IAppOpsService appOps) {  
      synchronized (mLock) {  
          //第一步:初始化相关的变量  
          mSystemReady = true;  
          mAppOps = appOps;  
          mDreamManager = getLocalService(DreamManagerInternal.class);  
          //初始化互动屏保管理  
          mDisplayManagerInternal = getLocalService(DisplayManagerInternal.class);  
          //初始化屏幕显示管理服务  
          mPolicy = getLocalService(WindowManagerPolicy.class);  
          mBatteryManagerInternal = getLocalService(BatteryManagerInternal.class);  
          //初始化电池管理服务  

          PowerManager pm = (PowerManager) 
                      mContext.getSystemService(Context.POWER_SERVICE);  
          mScreenBrightnessSettingMinimum = pm.getMinimumScreenBrightnessSetting();  
          mScreenBrightnessSettingMaximum = pm.getMaximumScreenBrightnessSetting();  
          mScreenBrightnessSettingDefault = pm.getDefaultScreenBrightnessSetting();  
          //获取屏幕的亮度值,最大亮度,最小亮度,默认亮度  
          SensorManager sensorManager = new SystemSensorManager
                          (mContext, mHandler.getLooper());  
          //获取传感器管理服务  
          mBatteryStats = BatteryStatsService.getService();  
          //初始化电量统计服务  
          mNotifier = new Notifier(
              Looper.getMainLooper(), 
              mBatteryStats,mAppOps, 
              createSuspendBlockerLocked("PowerManagerService.Broadcasts"),  
              mPolicy);  

          mWirelessChargerDetector = new WirelessChargerDetector(sensorManager,  
          createSuspendBlockerLocked
                      ("PowerManagerService.WirelessChargerDetector"),mHandler);  
          mSettingsObserver = new SettingsObserver(mHandler);  
          //settings的监听器  
          mLightsManager = getLocalService(LightsManager.class);  
          //LED指示灯管理服务  
          mAttentionLight = 
              mLightsManager.getLight(LightsManager.LIGHT_ID_ATTENTION);  

          // 初始化屏幕显示服务  
          mDisplayManagerInternal.initPowerManagement(  
                  mDisplayPowerCallbacks, mHandler, sensorManager);  
          //第二步:注册相关的BroadCastReceiver  
          IntentFilter filter = new IntentFilter();  
          filter.addAction(Intent.ACTION_BATTERY_CHANGED);  
          filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);  
          mContext.registerReceiver(new BatteryReceiver(), filter, null, mHandler);  
          //注册电池变化的接收器  
          filter = new IntentFilter();  
          filter.addAction(Intent.ACTION_DREAMING_STARTED);  
          filter.addAction(Intent.ACTION_DREAMING_STOPPED);  
          mContext.registerReceiver(new DreamReceiver(), filter, null, mHandler);  
          //注册屏保开始和结束的接收器  
          filter = new IntentFilter();  
          filter.addAction(Intent.ACTION_USER_SWITCHED);  
          mContext.registerReceiver
                  (new UserSwitchedReceiver(), filter, null, mHandler);  
          //注册切换用户的接收器  
          filter = new IntentFilter();  
          filter.addAction(Intent.ACTION_DOCK_EVENT);  
          mContext.registerReceiver(new DockReceiver(), filter, null, mHandler);  
            
          //第三步.注册设置变化的监听器  
          final ContentResolver resolver = mContext.getContentResolver();  
          resolver.registerContentObserver(Settings.Secure.getUriFor(  
                  Settings.Secure.SCREENSAVER_ENABLED),  
                  false, m

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Android系统面试题全解析 文章被收录于专栏

2020年研究生毕业后,工作重心由嵌入式Linux转为安卓系统,Android发展已经很多年,网上面向中初级Android系统开发的面经还比较少,也不够集中,因此梳理出本专栏,本专栏收集了本人工作中持续积累的众多安卓系统知识,持续更新中。

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-12 19:17
美团 数开 25x15.5 硕士其他
点赞 评论 收藏
分享
腾讯 pcg(搜狗输入法) 薪资base多4和签字费
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务