我对取消传感器侦听器的注册感到困惑。假设我忘记注销侦听器。应用程序销毁后会发生什么?
安卓操作系统会继续向应用程序发送消息吗?但是应用程序被销毁,因此其进程被终止。任何人都可以帮助回答这个问题吗?谢谢:)
但是应用程序被销毁,因此其过程是 终止。
情况并非总是如此。在正常情况下,Android 将使您的申请流程尽可能长时间地保持活动状态。如果您碰巧有仍在注册的侦听器,则这些侦听器引用的对象(很可能是 Activity 的子类)的旧副本可能不会被垃圾回收并继续占用宝贵的内存。传感器侦听器尤其糟糕,因为框架还花费了继续为它们提供信息所需的其他大量资源。
若要演示此问题,只需在有意注册的传感器侦听器中打印出一些日志消息即可。您将看到,即使您正常退出应用程序,日志消息也将继续打印出来。然后,您还可以运行 MAT 来检查进程的内存,它可能会显示 Activity 对象的副本仍在内存中徘徊。如果您多次启动应用,MAT 会显示您的活动的多个"僵尸"副本仍然存在:)
developer.android.com 明确指出
始终确保禁用不需要的传感器,尤其是在活动暂停时。如果不这样做,可能会在短短几个小时内耗尽电池电量。请注意,当屏幕关闭时,系统不会自动禁用传感器。
http://developer.android.com/reference/android/hardware/SensorManager.html
是的,您应该这样做,因为数据仍将发送到您的应用程序,我相信"close" (unregister)
您"opened" (registered)
的东西始终是一种很好的编程风格。我编写了一些示例方法来演示如何执行此操作:
(注意:此代码必须放在实现SensorEventListener, OnTouchListener, OnKeyListener
的类中)
/**
* <b><i>public void useAccelerometer(boolean use)</i></b>
* <br>
* Since: API 1
* <br>
* <br>
* Set if you would like to enable the use of the accelerometer.
*
* @param use
* <br>
* True will enable the use of the accelerometer.
* <br>
* False will disable the use of the accelerometer.
*
*/
public void useAccelerometer(boolean use) {
if(use == true) {
manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME);
if(this.logGameEngineInputLog == true) {
gameEngineLog.d(classTAG, "Accelerometer enabled");
}
}
else {
manager.unregisterListener(this, accelerometer);
if(this.logGameEngineInputLog == true) {
gameEngineLog.d(classTAG, "Accelerometer disabled");
}
}
}
/**
* <b><i>public void useTouchscreen(boolean use)</i></b>
* <br>
* Since: API 1
* <br>
* <br>
* Set if you would like to enable the use of the touch screen.
*
* @param use
* <br>
* True will enable the use of the touch screen.
* <br>
* False will disable the use of the touch screen.
*
*/
public void useTouchscreen(boolean use) {
if(use == true) {
view.setOnTouchListener(this);
if(this.logGameEngineInputLog == true) {
gameEngineLog.d(classTAG, "Touchscreen enabled");
}
}
else {
view.setOnTouchListener(null);
if(this.logGameEngineInputLog == true) {
gameEngineLog.d(classTAG, "Touchscreen disabled");
}
}
}
/**
* <b><i>public void useKeyboard(boolean use)</i></b>
* <br>
* Since: API 1
* <br>
* <br>
* Set if you would like to enable the use of the keyboard.
*
* @param use
* <br>
* True will enable the use of the keyboard.
* <br>
* False will disable the use of the keyboard.
*
*/
public void useKeyboard(boolean use) {
if(use == true) {
view.setOnKeyListener(this);
if(this.logGameEngineInputLog == true) {
gameEngineLog.d(classTAG, "Keyboard enabled");
}
}
else {
view.setOnKeyListener(null);
if(this.logGameEngineInputLog == true) {
gameEngineLog.d(classTAG, "Keyboard disabled");
}
}
}
即使应用程序被破坏,传感器也将继续工作,因为它没有被取消注册。总的来说,如果您注册了传感器,那么您也必须取消注册它。