Android 2.3.5/4.0.3/4.1PowerManager简单总结和心得体会

零、目的:

4.4上的PowerManagerService(下称PMS)被完全重构了,在接手4.4 PMS之前对之前PowerManagerService做一个总结。

一、概述:

总的来说,PMS在庞大的Framework中算是很简单但是很经典的一个Service:

没有复杂的逻辑,整体架构非常清晰,上接应用提供接口,下承驱动,维护状态。

对上,暴露接口主要分为两类:

a.wakelock 唤醒锁类,此类接口主要给应用用来改变/保持系统的电源状态,

拿住partial wakelock可以保持系统不进入深睡眠。

拿住full wakelock 再或上cause_wake_up就可以点亮屏幕(参考锁屏)

拿住和释放proximity_wakelock就可以激活/去激活距离传感器(参考phone)

pokelock可以重置屏幕的超时(参考phone)

需要注意的是,应用一定一定一定要记住释放partial的wakelock,否则就会引发很严重的功耗问题,

常见的是一些第三方应用中拿锁不放,手机放置一晚上就没电了就是这原因。

b. 设置屏幕/键盘灯亮度

此类接口非常简单,用的地方也不多,主要就是往led的sys文件系统里的brightness节点写入需要的亮度值即可。

二、核心实现:

PMS的所有状态的切换都是围绕着setPowerState这个方法来的,其他接口通过外界的”刺激“来改变mPowerState 或者mWakeLockSate,

然后通过SetPowerState来更新状态,从而达到目的。

例子不详细举了,相信能看到这里的人都看过代码,比较好的例子就是userAcitivy/acquireWakeLock

既然说核心实现,其实PMS的大部分工作都可以简化为下面的几句话:

1.  echo   wake_lock_name    >/sys/power/wake_lock     //held住 叫wake_lock_name的partial wakelock

2.  echo  wake_lock_name  >/sys/power/wake_unlock   //释放  叫wake_lock_name 的partia  wakelock

3.  echo    on >/sys/power/state                                   //唤醒系统

4.   echo   mem  >/sys/power/state                               //挂起系统

5 .  echo   brightness > /sys/class/leds/back-light/brightness   //设置背光亮度为brightness

6.  echo   brightness  >  /sys/class/leds/button-light/brightness  //设置键盘灯亮度为brightness

其他的都是在给这些实现来维护状态的,比如维护当前哪些应用拿了锁,做了哪些操作的时候需要将屏幕点亮/熄灭,屏幕超时的维护等等。

搞明白这里我觉得就差不多了,PMS+LightService+batteryService组成了Framework中的电源管理,是一个学习framework架构的非常好的例子。

Android 2.3.5/4.0.3/4.1PowerManager简单总结和心得体会相关推荐

  1. 《Android深度探索》(卷1)HAL与驱动开发 第十章心得体会

    本章主要讲了嵌入式Linux的调试技术. (一)打印内核调试信息:printk Printk函数用法与printf函数类似,只不过printk函数运行在内核空间,printf函数运行在用户空间,pri ...

  2. Android Studio 配置OpenCV4.4.0 不用安装OpenCV Manager (泪崩居然用了礼拜天2天的时间居然还没配置成功,今天又看了下配置成功了)

    Android Studio 配置OpenCV4.4.0 ,说来惭愧居然用户礼拜天2天的时间呢,期间遇到的问题大致有4个问题 这里我也总结出了最后在列举出来,(可能是新版和之前旧版本不一样的问题按照网 ...

  3. No cached version of com.android.tools.build:gradle:2.0.0 available for offline mode.

    异常场景 从AS2.0升级到2.1,重新编译工程后,抛出了如下异常 Error:A problem occurred configuring root project 'AndroidStudioPr ...

  4. 问题解决-Failed to resolve: com.android.support.constraint:constraint-layout:1.0.0-alpha7

    问题解决-Failed to resolve: com.android.support.constraint:constraint-layout:1.0.0-alpha7 参考文章: (1)问题解决- ...

  5. android 控件id为0,Android Studio错误:(3,0)未找到ID为“com.android.application”的插件...

    我是 Android工作室的新手,有人写了一个最初用于应用发明家的应用程序.我按照他的模板,添加了新的东西.该应用程序与Gradle有问题,并给我以下内容. "Error:(3, 0) Pl ...

  6. com.android.tools.build:gradle:2.0.0-alpha3 build errors

    当Android studio 编译时间过长且出现问题比如下面的提示: java.exe'' finished with non-zero exit value 3. 此时就要检查一下跟目录下面的bu ...

  7. MAC Android Studio| Error: The android gradle plugin version 3.0.0-alpha1 is too old

    building 报错 The android gradle plugin version 3.0.0-alpha1 is too old, please update to the latest v ...

  8. 关于android的4.2的0文件夹的详解

    关于android的4.2的0文件夹的详解 ---- android 4.0 ---- 在galaxy nexus(GN)手机上userdata分区很大,被挂在/data目录,用户的数据通常是放在sd ...

  9. Android使用NDK OpenGL ES3.0绘制一个三角形

    Android使用NDK  OpenGL ES3.0绘制一个三角形 [尊重原创,转载请注明出处]https://blog.csdn.net/guyuealian/article/details/820 ...

最新文章

  1. 用一句JQuery代码实现表格的简单筛选
  2. 微信小程序ios可以上下左右拖动的问题
  3. 程序员的福音,AI可以自动修复bug了!
  4. 图像处理:边缘提取算法(边缘提取算子总结)——Matlab代码实现
  5. SNF快速开发平台2019-权限管理模型简介-权限都在这里
  6. java中content啥意思_JSTL标签中的body-content标签体内容输出格式的介绍
  7. 机器学习算法之生成树
  8. Linux sed命令完全攻略(超级详细)
  9. Vue+ElementUI项目使用webpack输出MPA
  10. linux6.5防火墙开端口,Linux(CentOS6.5) 开放端口,配置防火墙
  11. [转载]用SQL语句添加删除修改字段
  12. mac中安装使用podman,替换docker
  13. 仿QQ项目(一):好友列表
  14. STM32 WinUSB(WCID)免驱高速通信 20M/s(附详细测试)
  15. charles安卓手机抓包
  16. es中must和should的组合查询
  17. 查询任何一门课程成绩在70分以上的姓名、课程名称和分数
  18. 服装供应链管理系统介绍
  19. 设置软件以管理员权限开机自启动,MemReduct为例
  20. 第三次人工智能热潮和企业SaaS

热门文章

  1. WPF之Binding基础三 Binding的路径Path
  2. html基础知识补全
  3. Google的Java常用类库 Guava
  4. 开源机器学习工具SQLFlow
  5. Kaldi AMI数据集脚本学习3---run_ihm.sh stage 1~3
  6. Javascript第六章世上最全常用RegExp正则表达式及表单验证源码第七课
  7. pvrect r语言 聚类_技术贴 | R语言——肠型分析:介绍、方法
  8. oracle ora 16014,ORA-16014 ORA-00312错误解决
  9. laravel 运用
  10. ie 代理设置中地址和端口置灰的解决办法