Android 2.3.5/4.0.3/4.1PowerManager简单总结和心得体会
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简单总结和心得体会相关推荐
- 《Android深度探索》(卷1)HAL与驱动开发 第十章心得体会
本章主要讲了嵌入式Linux的调试技术. (一)打印内核调试信息:printk Printk函数用法与printf函数类似,只不过printk函数运行在内核空间,printf函数运行在用户空间,pri ...
- Android Studio 配置OpenCV4.4.0 不用安装OpenCV Manager (泪崩居然用了礼拜天2天的时间居然还没配置成功,今天又看了下配置成功了)
Android Studio 配置OpenCV4.4.0 ,说来惭愧居然用户礼拜天2天的时间呢,期间遇到的问题大致有4个问题 这里我也总结出了最后在列举出来,(可能是新版和之前旧版本不一样的问题按照网 ...
- 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 ...
- 问题解决-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)问题解决- ...
- android 控件id为0,Android Studio错误:(3,0)未找到ID为“com.android.application”的插件...
我是 Android工作室的新手,有人写了一个最初用于应用发明家的应用程序.我按照他的模板,添加了新的东西.该应用程序与Gradle有问题,并给我以下内容. "Error:(3, 0) Pl ...
- com.android.tools.build:gradle:2.0.0-alpha3 build errors
当Android studio 编译时间过长且出现问题比如下面的提示: java.exe'' finished with non-zero exit value 3. 此时就要检查一下跟目录下面的bu ...
- 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 ...
- 关于android的4.2的0文件夹的详解
关于android的4.2的0文件夹的详解 ---- android 4.0 ---- 在galaxy nexus(GN)手机上userdata分区很大,被挂在/data目录,用户的数据通常是放在sd ...
- Android使用NDK OpenGL ES3.0绘制一个三角形
Android使用NDK OpenGL ES3.0绘制一个三角形 [尊重原创,转载请注明出处]https://blog.csdn.net/guyuealian/article/details/820 ...
最新文章
- 用一句JQuery代码实现表格的简单筛选
- 微信小程序ios可以上下左右拖动的问题
- 程序员的福音,AI可以自动修复bug了!
- 图像处理:边缘提取算法(边缘提取算子总结)——Matlab代码实现
- SNF快速开发平台2019-权限管理模型简介-权限都在这里
- java中content啥意思_JSTL标签中的body-content标签体内容输出格式的介绍
- 机器学习算法之生成树
- Linux sed命令完全攻略(超级详细)
- Vue+ElementUI项目使用webpack输出MPA
- linux6.5防火墙开端口,Linux(CentOS6.5) 开放端口,配置防火墙
- [转载]用SQL语句添加删除修改字段
- mac中安装使用podman,替换docker
- 仿QQ项目(一):好友列表
- STM32 WinUSB(WCID)免驱高速通信 20M/s(附详细测试)
- charles安卓手机抓包
- es中must和should的组合查询
- 查询任何一门课程成绩在70分以上的姓名、课程名称和分数
- 服装供应链管理系统介绍
- 设置软件以管理员权限开机自启动,MemReduct为例
- 第三次人工智能热潮和企业SaaS
热门文章
- WPF之Binding基础三 Binding的路径Path
- html基础知识补全
- Google的Java常用类库 Guava
- 开源机器学习工具SQLFlow
- Kaldi AMI数据集脚本学习3---run_ihm.sh stage 1~3
- Javascript第六章世上最全常用RegExp正则表达式及表单验证源码第七课
- pvrect r语言 聚类_技术贴 | R语言——肠型分析:介绍、方法
- oracle ora 16014,ORA-16014 ORA-00312错误解决
- laravel 运用
- ie 代理设置中地址和端口置灰的解决办法