Android 接收系统灭屏广播延时问题

接收系统灭屏广播延时问题


问题描述:

    屏幕灭屏与亮屏时会分别发送两个广播SCREEN_ON和SCREEN_OFF,这两个action通过代码的形式注册广播接收器能被监听到。

    笔者在视频项目开发过程中就有用到,监听SCREEN_OFF广播消息,实现灭屏暂停播放功能。但是在使用过程中发现,该广播存在延时的情况,严重的时候延时了两三秒之久,这就引起一个问题,屏幕熄灭了,视频还在播放,过两三秒后声音才停止。


解决方案:

    查看View的源码,于是找到了如下方法:

/**
 * 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) {
}

    注释中写道:不管是自动或者手动,当屏幕状态变化时,这个方法就会被调用。这里的屏幕状态,就是SCREEN_ON和SCREEN_OFF

因此我们可以利用该方法实时获取屏幕状态变化,通过状态的判断,即可实现屏幕灭屏和亮屏的监听。


具体实现:

    我们可以自己写一个View,继承原生的View,重写onScreenStateChanged,并在这里加回调,即可实时获取屏幕状态变化。

自定义View:

public class FloatView extends LinearLayout {
    private FloatViewCallback mCallback;

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

    ……

    @Override
    public void onScreenStateChanged(int screenState) {
        super.onScreenStateChanged(screenState);
        if (mCallback != null){
            mCallback.onScreenState(screenState);
        }
    }
}

自定义Callback:

public interface FloatViewCallback {
    public static final int SCREEN_OFF = 0;
    public static final int SCREEN_ON = 1;
    void onScreenState(int screenState);
}

需要的地方实现:

mFloatView.setScreenStateCallback(new FloatViewCallback() {
    @Override
    public void onScreenState(int screenState) {
        //do something
    }
});

你可能感兴趣的:(Android)