-- By Zhongxiang.huang
问题描述:
Android屏幕灭屏与亮屏时会分别发送两个广播SCREEN_ON和SCREEN_OFF,这两个action通过代码的形式注册广播接收器能被监听到。
笔者在某个视频应用的项目开发过程中就有用到,监听SCREEN_OFF广播消息,实现灭屏暂停播放功能。但是在使用过程中发现,该广播存在延时的情况,严重的时候延时了两三秒之久,这就会导致一个问题:屏幕熄灭了,视频还在播放,过两三秒后声音才停止。
解决方案:
查看View的源码,于是找到了如下方法:
/**
* This method is called whenever thestate of the screen this view is
* attached to changes. A state changewill 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 beeither
* {@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开发中,监听SCREEN_OFF广播实现灭屏暂停播放功能时遇到广播延迟,导致屏幕熄灭后视频仍继续播放。通过查看View源码,发现可以重写onScreenStateChanged方法实时获取屏幕状态变化,从而解决延迟问题。自定义View并实现回调方法,以在屏幕状态改变时立即响应。
461

被折叠的 条评论
为什么被折叠?



