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

Android 从子活动返回到父活动时如何关闭接近传感器,android,proximity,Android,Proximity,我在我的孩子活动中使用了接近传感器,该传感器工作正常,但当我返回到家长活动时,接近传感器仍保持打开状态。我在孩子活动的onPause和onestory中注销了接近传感器,但仍然保持打开状态。我用接近传感器在接近面部时关闭屏幕,就像呼叫应用程序一样,打开接近传感器,在结束呼叫后,它返回到childActivity,但接近传感器仍保持打开状态 我的孩子活动如下所示: Toolbar toolbar; ActionBar actionBar; private SensorManager mSenso

我在我的孩子活动中使用了接近传感器,该传感器工作正常,但当我返回到家长活动时,接近传感器仍保持打开状态。我在孩子活动的
onPause
onestory
中注销了接近传感器,但仍然保持打开状态。我用接近传感器在接近面部时关闭屏幕,就像呼叫应用程序一样,打开接近传感器,在结束呼叫后,它返回到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);
}
工具栏;
ActionBar ActionBar;
私人传感器管理器;
私用传感器;
PowerManager pm;
PowerManager.WakeLock WakeLock;
私有静态最终字符串MYLOCK=ProximitySensorActivity.class.getSimpleName();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u Proximition\u传感器);
toolbar=(toolbar)findviewbyd(R.id.toolbar);
设置支持操作栏(工具栏);
actionBar=getSupportActionBar();
actionBar.setTitle(“接近传感器”);
actionBar.setDisplayHomeAsUpEnabled(true);
操作条。设置HomeAsupIndicator(右侧可绘制。左侧);
msSensorManager=(SensorManager)getSystemService(Context.SENSOR\u服务);
mProximity=mSensorManager.getDefaultSensor(Sensor.TYPE_-approximity);
}
@凌驾
传感器更改时的公共无效(传感器事件){
浮动距离=事件值[0];
if(event.sensor.getType()==sensor.TYPE\u){
pm=(PowerManager)getSystemService(Context.POWER\u服务);
wakeLock=pm.newWakeLock(PowerManager.proximition\u SCREEN\u OFF\u WAKE\u LOCK,MYLOCK);

如果(距离您在
onResume()中注册它;

onResume();
在将
活动带到前面时调用,如果从另一个活动返回,也会调用该活动。

要防止出现这种情况,请创建一些标志,并在注销接收器时在
onPause
中将其设置为true。然后在
onResume()中检查该标志。

只需将其添加到代码中即可

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

希望它能工作

您的问题在于
onPause()
和/或
onDestroy()
中的
wakeLock

请注意,我已将
wakeLock.isHeld()
替换为
wakeLock!=null
,原因是
wakeLock.isHeld()
一直返回false。即使调用了
wakeLock.acquire()


您只需在
onPause()中释放wakelock

这会给我一个异常:java.lang.RuntimeException:无法暂停活动{com.app2.apptwoo/com.app2.apptwoo.ProximitySensorActivity}:java.lang.RuntimeException:WakeLock在锁定的ProximitySensorActivity下对我有效,我制作了一个完整的项目和活动,只是为了看看这里出了什么问题。你确定所有操作都正确吗?听起来好像存在
活动生命周期
问题。
@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);
}