SensorEventListener 不会使用 ungisterListener() 方法取消注册

2022-09-01 13:25:34

我有非常简单的Android应用程序:在活动中,我有一个按钮,我启动/停止定向管理器。但是,在取消注册后,在ddms中,我仍然可以看到线程android.hardware.SensorManager$SensorThread](正在运行)。

注册码:

sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
if (sensors.size() > 0)
{
    sensor = sensors.get(0);
    running = sensorManager.registerListener(sensorEventListener, sensor, SensorManager.SENSOR_DELAY_FASTEST);
}

和取消注册:

try
{
    if (sensorManager != null && sensorEventListener != null)
    {
        sensorManager.unregisterListener(sensorEventListener,sensor);
        running = false;
    }
}
catch (Exception e)
{
    Log.w(TAG, e.getMessage());
}

该方法确实被执行,但是它不会经常杀死传感器线程,这会继续运行并耗尽电池电量。几个小时后,我的应用程序被列出20-30%的电池消耗。这怎么可能?如何确保传感器未注册?我在 logcat 中没有任何异常或任何错误。我尝试在服务中运行侦听器 - 同样的事情。unregisterListener()


答案 1

就我而言,为了解决这个问题,我需要纠正我用来获取SensorManager的上下文。我在一个服务中,我需要以这种方式获取传感器管理器:

SensorManager sensorManager = (SensorManager) getApplicationContext().getSystemService(SENSOR_SERVICE);

因此,只需验证您是否以正确的方式获得传感器管理器即可。


答案 2

你没有显示足够的代码来确定,但也许是你的测试

if (sensorManager != null && sensorEventListener != null)

根本就不准确。也就是说,或者可能是当您仍注册为侦听时。sensorManagersensorEventListenernull


推荐