Android4.4电源管理——距离传感器
来源:互联网 发布:求有大秀的直播软件 编辑:程序博客网 时间:2024/06/04 18:51
//设置距离传感器的监听函数和状态
private void setProximitySensorEnabled(boolean enable) {
if (enable) {if (!mProximitySensorEnabled) {
mProximitySensorEnabled = true;
mSensorManager.registerListener(mProximitySensorListener, mProximitySensor,
SensorManager.SENSOR_DELAY_NORMAL, mHandler);
}
} else {
if (mProximitySensorEnabled) {
mProximitySensorEnabled = false;
mProximity = PROXIMITY_UNKNOWN;
mPendingProximity = PROXIMITY_UNKNOWN;
mHandler.removeMessages(MSG_PROXIMITY_SENSOR_DEBOUNCED);
mSensorManager.unregisterListener(mProximitySensorListener);
clearPendingProximityDebounceTime(); // release wake lock (must be last)
}
}
}
//传感器监听类的具体实现
private final SensorEventListener mProximitySensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
if (mProximitySensorEnabled) {
final long time = SystemClock.uptimeMillis();
final float distance = event.values[0];
boolean positive = distance >= 0.0f && distance < mProximityThreshold;
handleProximitySensorEvent(time, positive);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// Not used.
}
};
//处理距离传感器的相关事件
if (mProximitySensorEnabled) {
if (mPendingProximity == PROXIMITY_NEGATIVE && !positive) {
return; // no change
}
if (mPendingProximity == PROXIMITY_POSITIVE && positive) {
return; // no change
}
// Only accept a proximity sensor reading if it remains
// stable for the entire debounce delay. We hold a wake lock while
// debouncing the sensor.
mHandler.removeMessages(MSG_PROXIMITY_SENSOR_DEBOUNCED);
if (positive) {
mPendingProximity = PROXIMITY_POSITIVE;
setPendingProximityDebounceTime(
time + PROXIMITY_SENSOR_POSITIVE_DEBOUNCE_DELAY); // acquire wake lock
} else {
mPendingProximity = PROXIMITY_NEGATIVE;
setPendingProximityDebounceTime(
time + PROXIMITY_SENSOR_NEGATIVE_DEBOUNCE_DELAY); // acquire wake lock
}
// Debounce the new sensor reading.
debounceProximitySensor();
}
}
//获取电源锁
private void setPendingProximityDebounceTime(long debounceTime) {
if (mPendingProximityDebounceTime < 0) {
mDisplaySuspendBlocker.acquire(); // acquire wake lock
}
mPendingProximityDebounceTime = debounceTime;
}
//传感器防抖处理
private void debounceProximitySensor() {
if (mProximitySensorEnabled
&& mPendingProximity != PROXIMITY_UNKNOWN
&& mPendingProximityDebounceTime >= 0) {
final long now = SystemClock.uptimeMillis();
if (mPendingProximityDebounceTime <= now) {
// Sensor reading accepted. Apply the change then release the wake lock.
mProximity = mPendingProximit //非常重要,传感器触发的最后结果就是设置这个标志位
updatePowerState();// 更新屏幕状态
clearPendingProximityDebounceTime(); // release wake lock (must be last)
} else {
// Need to wait a little longer.
// Debounce again later. We continue holding a wake lock while waiting.
Message msg = mHandler.obtainMessage(MSG_PROXIMITY_SENSOR_DEBOUNCED);
msg.setAsynchronous(true);
mHandler.sendMessageAtTime(msg, mPendingProximityDebounceTime);
}
}
}
//回调函数,每次调用过程中都会设置电源锁,防止函数执行过程中CPU休眠。
private void sendOnProximityPositiveWithWakelock() {
mDisplaySuspendBlocker.acquire();
mCallbackHandler.post(mOnProximityPositiveRunnable);
}
private final Runnable mOnProximityPositiveRunnable = new Runnable() {
@Override
public void run() {
mCallbacks.onProximityPositive();
mDisplaySuspendBlocker.release();
}
};
private void sendOnProximityNegativeWithWakelock() {
mDisplaySuspendBlocker.acquire();
mCallbackHandler.post(mOnProximityNegativeRunnable);
}
private final Runnable mOnProximityNegativeRunnable = new Runnable() {
@Override
public void run() {
mCallbacks.onProximityNegative();
mDisplaySuspendBlocker.release();
}
};
//更新屏幕状态
private void updatePowerState() {
// Apply the proximity sensor.
if (mProximitySensor != null) {
//当距离传感器的锁被申请之后,且不是亮屏时,该条件满足
if (mPowerRequest.useProximitySensor
&& mPowerRequest.screenState != DisplayPowerRequest.SCREEN_STATE_OFF) {
setProximitySensorEnabled(true);
//距离传感器被遮挡时,会调用回调函数
if (!mScreenOffBecauseOfProximity
&& mProximity == PROXIMITY_POSITIVE) {
mScreenOffBecauseOfProximity = true;
sendOnProximityPositiveWithWakelock();//回调函数,通知电源管理服务
setScreenOn(false);
}
} else if (mWaitingForNegativeProximity
&& mScreenOffBecauseOfProximity
&& mProximity == PROXIMITY_POSITIVE
&& mPowerRequest.screenState != DisplayPowerRequest.SCREEN_STATE_OFF) {
setProximitySensorEnabled(true);
} else {
//当没有距离传感器的锁被申请时,将距离传感器使能
setProximitySensorEnabled(false);
mWaitingForNegativeProximity = false;
}
//当距离传感器没有遮挡时,调用回调函数
if (mScreenOffBecauseOfProximity
&& mProximity != PROXIMITY_POSITIVE) {
mScreenOffBecauseOfProximity = false;
sendOnProximityNegativeWithWakelock();//回调函数,通知电源管理服务
}
} else {
mWaitingForNegativeProximity = false;
}
//设置屏幕亮度
private void setScreenOn(boolean on) {
if (!mPowerState.isScreenOn() == on) {
mPowerState.setScreenOn(on);
if (on) {
mNotifier.onScreenOn();
} else {
mNotifier.onScreenOff();
}
}
/**
* Sets whether the screen is on or off.
*/
public void setScreenOn(boolean on) {
if (mScreenOn != on) {
if (DEBUG) {
Slog.d(TAG, "setScreenOn: on=" + on);
}
mScreenOn = on;
mScreenReady = false;
scheduleScreenUpdate();
}
}
private void scheduleScreenUpdate() {
if (!mScreenUpdatePending) {
mScreenUpdatePending = true;
postScreenUpdateThreadSafe();
}
}
private void postScreenUpdateThreadSafe() {
mHandler.removeCallbacks(mScreenUpdateRunnable);
mHandler.post(mScreenUpdateRunnable);
}
- Android4.4电源管理——距离传感器
- Android4.4电源管理——电源锁
- Android4.4电源管理——回调函数
- Android4.4电源管理——屏幕亮度设置
- Android4.4电源管理——呼吸灯
- Android4.4电源管理——wakeUpNoUpdateLocked分析
- android4.4电源管理——Input系统(Power键处理)
- android4.4电源管理——Input系统(Power键处理)
- 加速度、陀螺仪、电源、距离传感器的使用方法
- android4.0电源管理详解
- <2>Android4.4——传感器初始化流程
- Android4.0 扫描入网电源管理
- Linux电源管理研究笔记—动态电源管理(DPM)
- Linux电源管理研究笔记—动态电源管理(DPM)
- Linux电源管理研究笔记—动态电源管理(DPM)
- Linux电源管理研究笔记—动态电源管理(DPM)
- Android——距离传感器(PROXIMITY)的应用
- 距离传感器
- jstack dump分析
- 开心工作
- Linux Emacs 查找替换
- mysql学习笔记(一)之mysqlparameter
- 【解决】Starting MySQL.Manager of pid-file quit without updating fi[失败]
- Android4.4电源管理——距离传感器
- 学生成绩管理系统(C语言)
- 虚拟内存与内存映射文件区别与联系
- 301代码
- JAVA基础知识复习2
- px、dp和sp区别
- 矩阵优化递推的总结(不定期更新,最后更新20140321)
- 百度地图使用(一)添加地图
- 快速幂