簡體   English   中英

如何在從子活動返回到父活動時關閉接近傳感器

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

我在我的孩子活動中使用了接近傳感器 ,但工作正常,但是當我返回到父活動時, 接近傳感器仍然保持打開狀態。 我在我的孩子活動的onPauseonDestroy中有未注冊的接近傳感器,但仍然保持打開狀態。 我已經接近接近傳感器關閉屏幕時,就像打開接近傳感器的呼叫應用程序一樣,在結束呼叫后,它返回到childActivity,但接近傳感器仍然保持打開狀態。

我的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);
}

你在onResume();注冊它onResume();
onResume(); Activity被帶到前面時調用,如果從另一個活動返回它也被調用。
要防止這種情況,請在取消注冊接收器時創建一些標志,並在onPause中將其設置為true。 並在onResume()檢查該標志。

只需將其添加到您的代碼中

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

希望它有效

你的問題在於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);
}

請注意,我已將wakeLock.isHeld()替換為wakeLock!= null ,由於某種原因, WakeLock.isHeld()保持返回false。 甚至在WakeLock.acquire()之后。

你只需要在onPause()釋放wakelock。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM