Android Handler 即使在 activity 被销毁后也会保留 运行 一段时间
Android Handler keeps running for a while even after the activity has been destroyed
我读到 handler.postDelayed
方法有助于将任务暂停任意时间。所以我把它写进了光线传感器,让传感器每2秒检测一次光线,以节省电池寿命:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor light = sm.getDefaultSensor(Sensor.TYPE_LIGHT);
SensorEventListener listener;
if (light != null) {
final Handler handler = new Handler();
final Runnable task = new Runnable() {
@Override
public void run() {
sm.registerListener(listener, light, SensorManager.SENSOR_DELAY_NORMAL);
}
};
listener = new SensorEventListener() {
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
Toast.makeText(MainActivity.this, "accuracy changed!", Toast.LENGTH_SHORT).show();
}
@Override
public void onSensorChanged(SensorEvent event) {
sm.unregisterListener(listener, light);
// Do the stuff here with the received sensor light value, which is event.values[0]
handler.postDelayed(task, 2000);
}
};
}
@Override
protected void onPause() {
super.onPause();
sm.unregisterListener(listener, light);
}
@Override
protected void onResume() {
super.onResume();
sm.registerListener(listener, light, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onStop() {
super.onStop();
sm.unregisterListener(listener, light);
}
@Override
protected void onDestroy() {
super.onDestroy();
sm.unregisterListener(listener, light);
}
}
起初它似乎工作正常。但我发现,每次我退出应用程序时,它都会检测到光线大约 20 到 30 秒,就好像 activity 仍然打开一样。我究竟做错了什么?我什至添加了 onStop 和 onDestroy 方法只是为了确保它正确关闭。
在 activity 的 onDestroy() 中清除你的处理程序,如
handler.removeCallbacksAndMessages(null);
而且会马上停止!
我读到 handler.postDelayed
方法有助于将任务暂停任意时间。所以我把它写进了光线传感器,让传感器每2秒检测一次光线,以节省电池寿命:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor light = sm.getDefaultSensor(Sensor.TYPE_LIGHT);
SensorEventListener listener;
if (light != null) {
final Handler handler = new Handler();
final Runnable task = new Runnable() {
@Override
public void run() {
sm.registerListener(listener, light, SensorManager.SENSOR_DELAY_NORMAL);
}
};
listener = new SensorEventListener() {
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
Toast.makeText(MainActivity.this, "accuracy changed!", Toast.LENGTH_SHORT).show();
}
@Override
public void onSensorChanged(SensorEvent event) {
sm.unregisterListener(listener, light);
// Do the stuff here with the received sensor light value, which is event.values[0]
handler.postDelayed(task, 2000);
}
};
}
@Override
protected void onPause() {
super.onPause();
sm.unregisterListener(listener, light);
}
@Override
protected void onResume() {
super.onResume();
sm.registerListener(listener, light, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onStop() {
super.onStop();
sm.unregisterListener(listener, light);
}
@Override
protected void onDestroy() {
super.onDestroy();
sm.unregisterListener(listener, light);
}
}
起初它似乎工作正常。但我发现,每次我退出应用程序时,它都会检测到光线大约 20 到 30 秒,就好像 activity 仍然打开一样。我究竟做错了什么?我什至添加了 onStop 和 onDestroy 方法只是为了确保它正确关闭。
在 activity 的 onDestroy() 中清除你的处理程序,如
handler.removeCallbacksAndMessages(null);
而且会马上停止!