如何在Composable函数中获取系统服务以注册SensorManager?
在Jetpack Compose中注册SensorManager的实现方案
实现步骤
- 第一步:在Composable中通过
LocalContext获取当前上下文,再通过上下文获取系统传感器服务完成SensorManager初始化 - 第二步:使用
DisposableEffect关联传感器的注册与注销逻辑,和Composable的生命周期绑定,避免内存泄漏
完整示例代码
import android.content.Context import android.hardware.Sensor import android.hardware.SensorEvent import android.hardware.SensorEventListener import android.hardware.SensorManager import androidx.compose.foundation.layout.Column import androidx.compose.material3.Text import androidx.compose.runtime.* import androidx.compose.ui.platform.LocalContext @Composable fun SensorMonitorScreen() { val context = LocalContext.current // 初始化SensorManager val sensorManager = remember { context.getSystemService(Context.SENSOR_SERVICE) as SensorManager } // 记录加速度传感器数值 var accelerationX by remember { mutableFloatStateOf(0f) } var accelerationY by remember { mutableFloatStateOf(0f) } var accelerationZ by remember { mutableFloatStateOf(0f) } // 创建传感器事件监听器 val sensorListener = remember { object : SensorEventListener { override fun onSensorChanged(event: SensorEvent?) { event ?: return if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) { accelerationX = event.values[0] accelerationY = event.values[1] accelerationZ = event.values[2] } } override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) { // 按需处理精度变化逻辑 } } } // 生命周期绑定注册/注销逻辑 DisposableEffect(Unit) { // 注册加速度传感器监听,采样频率可按需调整 val accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) sensorManager.registerListener( sensorListener, accelerometer, SensorManager.SENSOR_DELAY_NORMAL ) // 组件销毁时注销监听 onDispose { sensorManager.unregisterListener(sensorListener) } } // 展示传感器数值 Column { Text(text = "X轴加速度: $accelerationX") Text(text = "Y轴加速度: $accelerationY") Text(text = "Z轴加速度: $accelerationZ") } }
注意事项
- 务必在
DisposableEffect的onDispose回调中执行注销逻辑,否则会出现内存泄漏 - 传感器采样频率可根据业务场景选择:
SENSOR_DELAY_FASTEST(最低延迟)、SENSOR_DELAY_GAME(适合游戏场景)、SENSOR_DELAY_UI(适合更新UI)、SENSOR_DELAY_NORMAL(普通默认) - 如果需要跨配置变更(如屏幕旋转)保留监听状态,可将
SensorManager和监听器的实例持有到ViewModel中,避免重复创建
内容的提问来源于stack exchange,提问作者mehdi dorreh
相关产品推荐
相关产品推荐

