美文网首页
View.onScreenStateChanged 解决广播延时

View.onScreenStateChanged 解决广播延时

作者: 毛先森 | 来源:发表于2018-05-04 14:10 被阅读94次

    前言

    image.png

    在解决公司项目 Bug 时,由于功能上依赖系统的屏幕监听广播(ACTION_SCREEN_ON 和 ACTION_SCREEN_OFF)。但是这里有个坑,广播发送有延时,当我们短时间内迅速地开启关闭屏幕,功能就异常了。

    刚开始想通过前台广播解决,但只有自定义广播可以设置前台,系统广播无法设置,这种结局方案也被放弃了,所谓吉人自有天助,终于找到一个终极解决方案:在我们的 View 中重写 View.onScreenStateChanged ,通过回调实现监听。

    View.onScreenStateChanged

    源代码如下:

    /**
     * This method is called whenever the state of the screen this view is
     * attached to changes. A state change will usually occurs when the screen
     * turns on or off (whether it happens automatically or the user does it
     * manually.)
     *
     * @param screenState The new state of the screen. Can be either
     *                    {@link #SCREEN_STATE_ON} or {@link #SCREEN_STATE_OFF}
     */
    public void onScreenStateChanged(int screenState) {
    }
    

    注释中写到:这个方法在屏幕开启和关闭都会触发这个方法,参数列表中 int screenState 代表着屏幕开启关闭状态。

    实现方案

    在我们自定义 View 中,重写这个方法,并且加回调,就可以实现跟踪屏幕效果。

    1. View 中重写

        // 添加屏幕监听
        @Override
        public void onScreenStateChanged(int screenState){
            super.onScreenStateChanged(screenState);
            if (mCallback != null){
                mCallback.onScreenState(screenState);
            }
    
        }
    

    2.定义回调

        //添加回调接口
        public interface DragLayerCallback {
            public static final int SCREEN_OFF = 0;
            public static final int SCREEN_ON = 1;
            void onScreenState(int screenState);
        }
    

    3.注册回调

    public void setScreenStateCallback(DragLayerCallback callback) {
            this.mCallback = callback;
        }
    

    4.在需要监听的地方实现

        mDragLayer.setScreenStateCallback(new DragLayer.DragLayerCallback() {
                @Override
                public void onScreenState(int screenState) {
                    // 开启屏幕
                    if (screenState==DragLayer.DragLayerCallback.SCREEN_ON){
                        screenOn();
                    }
                    // 关闭屏幕
                    else {
                        screenOff();
                    }
                }
            });
    

    相关文章

      网友评论

          本文标题:View.onScreenStateChanged 解决广播延时

          本文链接:https://www.haomeiwen.com/subject/apydrftx.html