Android系统开发--Android灯光系统之电池灯的流程分析

前期系统准备

  • 运行初始化,创建系统服务

  • 创建电池服务,获得电池灯;创建监听者监听上报电池事件;

    • mSystemServiceManager.startService(BatteryService.class);

    • mLed = new Led(contegetLocalService(LightsManager.class)); //实例化灯对象

    • mBatteryLight = lights.getLight(LightsManager.LIGHT_ID_BATTERY); //获得电池灯

    • batteryPropertiesRegistrar.registerListener(new BatteryListener());

      publishBinderService("battery", new BinderService());

      publishLocalService(BatteryManagerInternal.class, new LocalService()); //创建电池状态监听者

    • private final class BatteryListener extends IBatteryPropertiesListener.Stub {

      @Override

      public void batteryPropertiesChanged(BatteryProperties props) {

       final long identity = Binder.clearCallingIdentity();
      
       try {
      
           BatteryService.this.update(props);
      
       } finally {
      
           Binder.restoreCallingIdentity(identity);
      
       }

      }

}  //判断是否电池状态是否发生变化,如果发生变化,则将该事件通知
  • 创建电量控制服务;获得电池服务;注册电池广播监听;

    • mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class); //创建电量管理服务

    • mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());

      mBatteryManagerInternal = getLocalService(BatteryManagerInternal.class); //获取电池服务后通知系统准备就绪

    • 注册电池广播接收器

      临听ACTION_BATTERY_CHANGED(电池状态改变)

驱动上报事件处理流程

  • Linux底层驱动上报电池事件

  • BatteryListener的监听函数batteryPropertiesChanged被调用

  • 广播ACTION_BATTERY_CHANGED更新电池灯

  • BatteryService.java:update()

     processValuesLocked(false);  //通知电池服务更新电池灯
    • sendIntentLocked(); //通知到电池接收广播

    • mLed.updateLightsLocked(); //更新电池灯

  • 收到广播消息后执行BatteryReceiver.onReceive

  • handleBatteryStateChangedLocked(); //处理电池状态变化

  • PowerManagerService.java: handleBatteryStateChangedLocked()

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

  • PowerManagerService.java: updatePowerStateLocked()

updatePowerStateLocked();

最新文章

  1. Linux安全基础:vi的使用
  2. Bootstrap<基础四> 代码
  3. Spark External Datasets
  4. Linux内核@系统组成与内核配置编译
  5. IIS配置错误信息输出
  6. Windows 7 的系统文件修复:sfc /scannow
  7. ubuntu基本操作(2)
  8. JScript中的prototype(原型)属性研究
  9. 【转】android开发中关于模拟器emulation的常见问题
  10. OpenCV成长之路:直线、轮廓的提取与描述
  11. AngularJS入门教程:日期格式化
  12. EsRejectedExecutionException排错与线程池类型
  13. HDU 1541 树状数组
  14. 【bzoj4443 scoi2015】小凸玩矩阵
  15. AleNet模型笔记
  16. Pandas分组
  17. Java知多少(103)网络编程之IP地址和InetAddress类
  18. 实现tail
  19. MySQL缓存机制详解(一)
  20. nodejs初探一二

热门文章

  1. CentOS 6.5 Git源码安装
  2. 修改hadoop配饰文件文件后导致hive无法找到原有的dfs文件
  3. WPF绑定Binding及模式
  4. 一个智障安装了一天的python和graphlab的血泪史
  5. hdu 4705(树形DP)
  6. 复制对象(一)copy和mutableCopy方法
  7. CSU-1632 Repeated Substrings[后缀数组求重复出现的子串数目]
  8. 《从零开始学Swift》学习笔记(Day 27)——可选类型
  9. 一、docker临时记录
  10. python 获取exception 名字