简体   繁体   English

如何在从子活动返回到父活动时关闭接近传感器

[英]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. 我在我的孩子活动的onPauseonDestroy中有未注册的接近传感器,但仍然保持打开状态。 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. 我已经接近接近传感器关闭屏幕时,就像打开接近传感器的呼叫应用程序一样,在结束呼叫后,它返回到childActivity,但接近传感器仍然保持打开状态。

My ChildActivity is given below : 我的ChildActivity如下:

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();注册它onResume();
onResume(); is called when the Activity if brought to front, in case of returning from another activity it is called as well. Activity被带到前面时调用,如果从另一个活动返回它也被调用。
To prevent this, create some flag , and set it to true in onPause , when you unregister receiver. 要防止这种情况,请在取消注册接收器时创建一些标志,并在onPause中将其设置为true。 And in onResume() check for that flag. 并在onResume()检查该标志。

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() . 你的问题在于wakeLock onPause()和/或onDestroy() wakeLock

@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. 请注意,我已将wakeLock.isHeld()替换为wakeLock!= null ,由于某种原因, WakeLock.isHeld()保持返回false。 Even after WakeLock.acquire() is called. 甚至在WakeLock.acquire()之后。

You only need to release wakelock in onPause() . 你只需要在onPause()释放wakelock。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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