接收系统灭屏广播延时问题
问题描述:
屏幕灭屏与亮屏时会分别发送两个广播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 } });