Android sensor listener does not get unregistered or sensor still retrieves values

久未见 提交于 2020-01-03 17:40:47

问题


I have some problems with SensorManager.unregisterListener. They are similar with Android, Thread, Cannot unregister SensorEventListener and SensorEventListener doesn't get unregistered with unregisterListener() method. But I could not find my answer! I also followed SensorManager documentation example http://developer.android.com/reference/android/hardware/SensorManager.html#SENSOR_DELAY_UI.

The problem is that after the Activity is finished I unregister the listener but the sensor keeps sending values until the application is completely destroyed.

This is my code:

my SensorController implements SensorEventListener

public class SensorController implements SensorEventListener{

constructor:

public SensorController(Context context){
    sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
}

my SensorController onResume method is called when Activity's onResume callback is called:

public void onResume(){
    mAccelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    boolean ret1 = sensorManager.registerListener(this, mAccelerometerSensor, SensorManager.SENSOR_DELAY_UI);
    mMagneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
    boolean ret2 = sensorManager.registerListener(this, mMagneticSensor, SensorManager.SENSOR_DELAY_UI);

}

my SensorController onPause method is called when Activity's onPause callback is called:

public void onPause(){
    sensorManager.unregisterListener(this);
}

And in on SensorChanged I put a log to monitor the sensor events:

@Override
public void onSensorChanged(SensorEvent event) {
    this.computeRotationAngles(event);
    Log.i("SensorController", "onSensorChanged");
}

So... after the Activity onPause method, the onSensorChanged(SensorEvent event) still retrieves sensor events. Why?? I unregister it in SensorController.onPause() function. The sensors retrieve good values but I cannot stop them sending. What am I doing wrong?

Thank you very much in advance! I will be grateful for every small tip :)


回答1:


try to uninstall the application and reinstall. it works on mine.




回答2:


I faced similar issue.

Workaround to stop the sensor from draining the battery.

I used a static boolean mIsSensorUpdateEnabled. Set it to 'false' when you want to stop getting values from sensors. And in onSensorChanged() method, check the value of the boolean variable and again make to call to unregister the sensors. And this time, it works. The sensors would be unregistered and you will no longer get onSensorChanged callback.

public class MainActivity extends Activity implements SensorEventListener {
    private static boolean mIsSensorUpdateEnabled = false;
    private SensorManager mSensorManager;
    private Sensor mAccelerometer;

    @override
    protected void onCreate(){
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    }

    private startSensors(){
        mAccelerometer =  mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        int delay = 100000; //in microseconds equivalent to 0.1 sec
        mSensorManager.registerListener(this,
                mAccelerometer,
                delay
        );
        mIsSensorUpdateEnabled =true;
    }

    private stopSensors(){
        mSensorManager.unregisterListener(this, mAccelerometer);
        mIsSensorUpdateEnabled =false;
    }


    @Override
    public void onSensorChanged(SensorEvent event) {
        if (!mIsSensorUpdateEnabled) {
            stopSensors();
            Log.e("SensorMM", "SensorUpdate disabled. returning");
            return;
        }
        //Do other work with sensor data
    }
}


来源:https://stackoverflow.com/questions/24239949/android-sensor-listener-does-not-get-unregistered-or-sensor-still-retrieves-valu

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!