[英]How to turn off proximity sensor when returning back from child activity to parent activity
我在我的孩子活动中使用了接近传感器 ,但工作正常,但是当我返回到父活动时, 接近传感器仍然保持打开状态。 我在我的孩子活动的onPause
和onDestroy
中有未注册的接近传感器,但仍然保持打开状态。 我已经接近接近传感器关闭屏幕时,就像打开接近传感器的呼叫应用程序一样,在结束呼叫后,它返回到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.