前言
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();
}
}
});
网友评论