安卓传感器注销



我对取消传感器侦听器的注册感到困惑。假设我忘记注销侦听器。应用程序销毁后会发生什么?

安卓操作系统会继续向应用程序发送消息吗?但是应用程序被销毁,因此其进程被终止。任何人都可以帮助回答这个问题吗?谢谢:)

但是应用程序被销毁,因此其过程是 终止。

情况并非总是如此。在正常情况下,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");
            }
        }
    }

即使应用程序被破坏,传感器也将继续工作,因为它没有被取消注册。总的来说,如果您注册了传感器,那么您也必须取消注册它。

相关内容

  • 没有找到相关文章

最新更新