简体   繁体   中英

How to turn off proximity sensor when returning back from child activity to parent activity

I have taken proximity sensor in my child activity which works fine but when I am returning back to parent activity The Proximity sensor still remains turn on. I had unregistered proximity sensor in onPause and onDestroy of my child activity but still remains turn on. I have taken proximity sensor to turn off screen when near to face just like call app which turns on Proximity sensor and after ending call it returns back to childActivity but the Proximity sensor still remains on.

My ChildActivity is given below :

Toolbar toolbar;
ActionBar actionBar;

private SensorManager mSensorManager;
private Sensor mProximity;
PowerManager pm;
PowerManager.WakeLock wakeLock;
private static final String MYLOCK=ProximitySensorActivity.class.getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_proximity_sensor);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    actionBar=getSupportActionBar();
    actionBar.setTitle("Proximity Sensor");
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setHomeAsUpIndicator(R.drawable.left);

    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);


}

@Override
public void onSensorChanged(SensorEvent event) {

    float distance = event.values[0];

    if(event.sensor.getType()==Sensor.TYPE_PROXIMITY) {
        pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        wakeLock = pm.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, MYLOCK);

        if (distance<1 && wakeLock!=null){
            if (!wakeLock.isHeld()){
                wakeLock.acquire();
            }
        }else if (wakeLock!=null){
            if (wakeLock.isHeld()) {
                wakeLock.release();
                getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
                getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
            }

        }

    }

}

@Override
public void onAccuracyChanged(Sensor sensor, int i) {

}

@Override
protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);

}

@Override
protected void onPause() {
    super.onPause();
    if (wakeLock.isHeld()) {
        wakeLock.release();
    }
    mSensorManager.unregisterListener(this);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (wakeLock.isHeld()) {
        wakeLock.release();
    }
    mSensorManager.unregisterListener(this);
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id=item.getItemId();
    if (id == android.R.id.home) {
        finish();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

You register it in onResume();
onResume(); is called when the Activity if brought to front, in case of returning from another activity it is called as well.
To prevent this, create some flag , and set it to true in onPause , when you unregister receiver. And in onResume() check for that flag.

Just add this to your code

@Override
public void onBackPressed() {
    mSensorManager.unregisterListener(this);
}

Hope it works

Your problem lies with wakeLock here in onPause() and/or onDestroy() .

@Override
protected void onPause() {
    super.onPause();
    if (wakeLock!= null) {
        wakeLock.release();
    }
    mSensorManager.unregisterListener(this);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (wakeLock!= null) {
        wakeLock.release();
    }
    mSensorManager.unregisterListener(this);
}

Note that I have replaced wakeLock.isHeld() with wakeLock!= null , for some reason WakeLock.isHeld() keeps returning false. Even after WakeLock.acquire() is called.

You only need to release wakelock in onPause() .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM