Android中多个Sensor客户端注册“First flush Pending”问题

本文详细分析了在Android应用中,当多个应用程序尝试监听同一Sensor时,出现的FirstflushPending问题,涉及SensorManager、SensorEventQueue、SensorEventConnection和SensorService的交互过程,以及如何解决初次注册时的延迟问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        引言:近期在项目上遇到一个“FLP”问题。 本文借此问题来分析:同一个sensor被多个App监听SensorEventListener事件时,app client被"First flush Pending"问题;


1. App Java层的常规步骤

private void registerListener() {
	Log.d(TAG, "registerListener");

	mAccel = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
	mGyro = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE_UNCALIBRATED);

	mSensorManager.registerListener(mSensorEventListener, mAccel,
			SENSOR_DELAY_NORMAL, SENSOR_DELAY_NORMAL, mHandler);
	mSensorManager.registerListener(mSensorEventListener, mGyro,
			SENSOR_DELAY_NORMAL, SENSOR_DELAY_NORMAL, mHandler);
}

2. registerListener()函数

        App侧调用的registerListener()接口,将会调用 SensorManager中的相应接口。进而调用SystemSensorManager中的registerListenerImpl()接口。

public boolean registerListener(SensorEventListener listener, Sensor sensor,
		int samplingPeriodUs, int maxReportLatencyUs, Handler handler) {
	int delayUs = getDelay(samplingPeriodUs);
	return registerListenerImpl(listener, sensor, delayUs, handler, maxReportLatencyUs, 0);
}

3. registerListenerImpl()函数

        从代码上看:

        ①. Sensor Events的种类有:REPORTING_MODE_CONTINUOUS、REPORTING_MODE_ON_CHANGE、REPORTING_MODE_ONE_SHOT三种类型;

        ②. 在SystemSersorManager中,最多的Listerner Client数量为128个;

        ③. 获取SensorEventQueue,执行addSensor()操作;

protected boolean registerListenerImpl(SensorEventListener listener, Sensor sensor,
		int delayUs, Handler handler, int maxBatchReportLatencyUs, int reservedFlags) {
	if (listener == null || sensor == null) {
		Log.e(TAG, "sensor or listener is null");
		return false;
	}
	// Trigger Sensors should use the requestTriggerSensor call.
	if (sensor.getReportingMode() == Sensor.REPORTING_MODE_ONE_SHOT) {
		Log.e(TAG, "Trigger Sensors should use the requestTriggerSensor.");
		return false;
	}
	if (maxBatchReportLatencyUs < 0 || delayUs < 0) {
		Log.e(TAG, "maxBatchReportLatencyUs and delayUs should be non-negative");
		return false;
	}
	if (mSensorListeners.size() >= MAX_LISTENER_COUNT) {	// MAX_LISTENER_COUNT:128
		throw new IllegalStateException("register failed, "
			+ "the sensor listeners size has exceeded the maximum limit "
			+ MAX_LISTENER_COUNT);
	}

	// Invariants to preserv
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值