android Phone 距离感应器锁的实现
android手机在正常打电话的过程中,靠近面部会灭屏,这个主要是PhoneApp中的mProximityWakeLock的作用。这个锁是在PhoneApp中被初始化的。
if ((pm.getSupportedWakeLockFlags()
& PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) != 0x0) {
mProximityWakeLock =
pm.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, LOG_TAG);
}
初始化这个锁之后,就有acquire与release这把锁来亮灭屏了,主要是函数updateProximitySensorMode(Phone.State state) 发挥的作用,这个函数在电话状态发生改变的时候会调用(还有类似手机插拔,手机方向改变等等)。那我们来看下这个函数主要做了什么。
此函数在源码中的解释已经很清楚了,在此不做赘述,这个函数主要是acquire与release mProximityWakeLock这把锁。那么,我们来看下,申请这把锁的时候,究竟干了什么事情。PhoneApp里的mProximityWakeLock.acquire() 调用PowerManager里的acquire(),然后调用PowerManagerService里的acquireWakeLock(),接着调用acquireWakeLockLocked()。这个函数就是我们最终申请锁的地方。
我们看下比较重要的地方
if ((flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) {
mProximityWakeLockCount++;
if (mProximityWakeLockCount == 1) {
enableProximityLockLocked();
}
}
这个地方就是判断,如果我们申请的是PROXIMITY_SCREEN_OFF_WAKE_LOCK,那么就enableProximityLockLocked();mProximityWakeLockCount说明的是PROXIMITY_SCREEN_OFF_WAKE_LOCK是采用计数方式的锁。
继续看enableProximityLockLocked()做了什么
private void enableProximityLockLocked() {
if (mDebugProximitySensor) {
Slog.d(TAG, "enableProximityLockLocked");
}
if (!mProximitySensorEnabled) {
// clear calling identity so sensor manager battery stats are accurate
long identity = Binder.clearCallingIdentity();
try {
mSensorManager.registerListener(mProximityListener, mProximitySensor,
SensorManager.SENSOR_DELAY_NORMAL);
mProximitySensorEnabled = true;
} finally {
Binder.restoreCallingIdentity(identity);
}
}
}
原来,这个函数主要是注册了mProximityListener,也就是说,我们监听距离感应器的操作是在加锁之后发生的。灭屏是在距离感应器监听到数值才激发的,那么我们看下mProximityListener。
SensorEventListener mProximityListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
long milliseconds = SystemClock.elapsedRealtime();
synchronized (mLocks) {
float distance = event.values[0];
long timeSinceLastEvent = milliseconds - mLastProximityEventTime;
mLastProximityEventTime = milliseconds;
mHandler.removeCallbacks(mProximityTask);
boolean proximityTaskQueued = false;
// compare against getMaximumRange to support sensors that only return 0 or 1
boolean active = (distance >= 0.0 && distance < PROXIMITY_THRESHOLD &&
distance < mProximitySensor.getMaximumRange());
if (mDebugProximitySensor) {
Slog.d(TAG, "mProximityListener.onSensorChanged active: " + active);
}
if (timeSinceLastEvent < PROXIMITY_SENSOR_DELAY) {
// enforce delaying atleast PROXIMITY_SENSOR_DELAY before processing
mProximityPendingValue = (active ? 1 : 0);
mHandler.postDelayed(mProximityTask, PROXIMITY_SENSOR_DELAY - timeSinceLastEvent);
proximityTaskQueued = true;
} else {
// process the value immediately
mProximityPendingValue = -1;
proximityChangedLocked(active);
}
// update mProximityPartialLock state
boolean held = mProximityPartialLock.isHeld();
if (!held && proximityTaskQueued) {
// hold wakelock until mProximityTask runs
mProximityPartialLock.acquire();
} else if (held && !proximityTaskQueued) {
mProximityPartialLock.release();
}
}
}
复写了onSensorChanged()函数,当检测到actiove的时候,执行了proximityChangedLocked并申请了一个mProximityPartialLock。(if else里的代码都会执行proximityChangedLocked)。proximityChangedLocked()函数会在active的时候执行goToSleepLocked。
至此,加锁过程分析完毕,解锁过程与加锁过程分析方法一样,不再赘述。
android Phone 距离感应器锁的实现相关推荐
- android距离感应器控制黑屏,白屏
最近在做一个网络通话的apk,功能和手机打sim卡电话一样.虽然只做java部分,但也遇到很多问题,其中一个就是模拟通话时的状态,要控制屏幕锁屏.我知道是通过手机上的距离感应器来实现,但也搞了好久,今 ...
- 距离感应器实现锁频教程
首先说一下android平台下的11种感应器: 1. ACCELEROMETER 加速,描述加速度的. 2.GRAVITY 重力,这个在大家都知道. ...
- android距离感应器控制屏幕灭屏白屏
最近在做一个网络通话的apk,功能和手机打sim卡电话一样.虽然只做java部分,但也遇到很多问题,其中一个就是模拟通话时的状态,要控制屏幕锁屏.我知道是通过手机上的距离感应器来实现,但也搞了好久,今 ...
- Android 距离感应器和耳机状态监测(控制Audio输出通道切换)
* 切换扬声器播放声音 or 听筒播放 * 1. 距离感应器:继承SensorEventListener这个监听,重写onSensorChanged方法 * 2. 检测耳机插入和拔出:Headse ...
- Android距离感应器P-Sensor浅析
(一) 前言 P-Sensor,距离感应器,可以感应手机和人体距离.具体使用用途是在通话过程中打开P-Sensor,那么当手机屏幕贴近用户脸部时,就会自动感应出手机和人体距离是多少.当小于某一个值时 ...
- PowerManager屏幕休眠断网与距离感应器P-Sensor
PowerManager.java . 1. 应用程序获取PowerManager服务, 我们可以这样书写: PowerManager pm = (PowerManager) getSystemSe ...
- Android4.2距离感应器
先说现象,现象就是来电话,接通电话,把手机屏幕靠近脸部,遮挡住P-sensor,屏幕变黑了,不遮挡住P-sensor,屏幕就点亮了.接着我们来看看代码流程. 距离感应器与屏幕休眠可参考 http:// ...
- 距离感应器下的休眠唤醒机制实现
前言 从事Android framework开发已经两年了,今天起决定把工作上遇到的问题.做过的需求都用博客的形式记录一下,特地新开一个系列---Android framework开发工作记录,有需要 ...
- 手机中的传感器:重力感应器、加速度传感器、陀螺仪、电子罗盘和光线距离感应器
智能手机之所以受到大家的欢迎,与其具有的娱乐功能分不开,使得它不仅仅是个通话的工具.智能手机支持那么多的娱乐应用,归根结底在于它里面集成的各类传感器,主要有重力感应器.加速度传感器.陀螺仪.电子罗盘和 ...
最新文章
- 修改系统tabbar的高度
- Failed to get convolution algorithm. This is probably because cuDNN failed to initialize
- 公布一个软件,轻新视频录播程序,H264/AAC录制视音频,保存FLV,支持RTMP直播...
- Linux常用命令—权限管理命令—权限管理命令chmod
- URL Routing
- 如何判断lib是/md or /mt编译的
- 百度人脸识别离线SDK_Android版_在线激活失败:not enough param_解决方案---百度人脸识别技术应用005
- 页面背景图尺寸不随浏览器缩放而变化
- 【Python】读取 txt 文件
- Node.js相关——CommonJS规范
- Esp8266(4)
- java lpad oracle_oracle函数lpad的简单用法
- 每日面试】阿里巴巴 Java后端 57min
- Repeated DNA
- 基于Opencv的图像处理-高光调整算法
- Matlab RGB 颜色对照表(0-1之间取值)
- WD蓝盘绿盘黑盘红盘的区别
- Qt中Q_NULLPTR的作用
- CAD文件版本怎么转换?如何将高版本转换成低版本?
- Windows Server 2012 R2配置IIS搭载PHP发生HTTP500解决办法