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 距离感应器锁的实现相关推荐

  1. android距离感应器控制黑屏,白屏

    最近在做一个网络通话的apk,功能和手机打sim卡电话一样.虽然只做java部分,但也遇到很多问题,其中一个就是模拟通话时的状态,要控制屏幕锁屏.我知道是通过手机上的距离感应器来实现,但也搞了好久,今 ...

  2. 距离感应器实现锁频教程

    首先说一下android平台下的11种感应器:            1. ACCELEROMETER 加速,描述加速度的.            2.GRAVITY 重力,这个在大家都知道.     ...

  3. android距离感应器控制屏幕灭屏白屏

    最近在做一个网络通话的apk,功能和手机打sim卡电话一样.虽然只做java部分,但也遇到很多问题,其中一个就是模拟通话时的状态,要控制屏幕锁屏.我知道是通过手机上的距离感应器来实现,但也搞了好久,今 ...

  4. Android 距离感应器和耳机状态监测(控制Audio输出通道切换)

    * 切换扬声器播放声音 or 听筒播放  * 1. 距离感应器:继承SensorEventListener这个监听,重写onSensorChanged方法  * 2. 检测耳机插入和拔出:Headse ...

  5. Android距离感应器P-Sensor浅析

    (一)  前言 P-Sensor,距离感应器,可以感应手机和人体距离.具体使用用途是在通话过程中打开P-Sensor,那么当手机屏幕贴近用户脸部时,就会自动感应出手机和人体距离是多少.当小于某一个值时 ...

  6. PowerManager屏幕休眠断网与距离感应器P-Sensor

    PowerManager.java . 1.  应用程序获取PowerManager服务, 我们可以这样书写: PowerManager pm = (PowerManager) getSystemSe ...

  7. Android4.2距离感应器

    先说现象,现象就是来电话,接通电话,把手机屏幕靠近脸部,遮挡住P-sensor,屏幕变黑了,不遮挡住P-sensor,屏幕就点亮了.接着我们来看看代码流程. 距离感应器与屏幕休眠可参考 http:// ...

  8. 距离感应器下的休眠唤醒机制实现

    前言 从事Android framework开发已经两年了,今天起决定把工作上遇到的问题.做过的需求都用博客的形式记录一下,特地新开一个系列---Android framework开发工作记录,有需要 ...

  9. 手机中的传感器:重力感应器、加速度传感器、陀螺仪、电子罗盘和光线距离感应器

    智能手机之所以受到大家的欢迎,与其具有的娱乐功能分不开,使得它不仅仅是个通话的工具.智能手机支持那么多的娱乐应用,归根结底在于它里面集成的各类传感器,主要有重力感应器.加速度传感器.陀螺仪.电子罗盘和 ...

最新文章

  1. 修改系统tabbar的高度
  2. Failed to get convolution algorithm. This is probably because cuDNN failed to initialize
  3. 公布一个软件,轻新视频录播程序,H264/AAC录制视音频,保存FLV,支持RTMP直播...
  4. Linux常用命令—权限管理命令—权限管理命令chmod
  5. URL Routing
  6. 如何判断lib是/md or /mt编译的
  7. 百度人脸识别离线SDK_Android版_在线激活失败:not enough param_解决方案---百度人脸识别技术应用005
  8. 页面背景图尺寸不随浏览器缩放而变化
  9. 【Python】读取 txt 文件
  10. Node.js相关——CommonJS规范
  11. Esp8266(4)
  12. java lpad oracle_oracle函数lpad的简单用法
  13. 每日面试】阿里巴巴 Java后端 57min
  14. Repeated DNA
  15. 基于Opencv的图像处理-高光调整算法
  16. Matlab RGB 颜色对照表(0-1之间取值)
  17. WD蓝盘绿盘黑盘红盘的区别
  18. Qt中Q_NULLPTR的作用
  19. CAD文件版本怎么转换?如何将高版本转换成低版本?
  20. Windows Server 2012 R2配置IIS搭载PHP发生HTTP500解决办法

热门文章

  1. 趣味c语言程序设计,C语言程序设计的趣味性教学.pdf
  2. 一步一步教你写股票走势图——K线图二(图表联动)
  3. 从零学习Vue - 02模板语法、el与data两种写法、mvvm模型、数据代理
  4. GIt后悔药:还原提交的操作(谨慎操作)
  5. 雪晴数据网 - 在线学习数据科学技术
  6. 《战争通论》详细分析世界十大兵书…
  7. 小米Civi正式发布:售价2599元起,聚焦年轻女性用户
  8. paper to do
  9. vue使用element-ui开发的后台管理系统使用中英文切换多语言国际化方案步骤流程
  10. 你需要知道的8种数据结构