Android环境下接收系统灭屏广播遇到延时问题的一个解决方法

在Android开发中,监听SCREEN_OFF广播实现灭屏暂停播放功能时遇到广播延迟,导致屏幕熄灭后视频仍继续播放。通过查看View源码,发现可以重写onScreenStateChanged方法实时获取屏幕状态变化,从而解决延迟问题。自定义View并实现回调方法,以在屏幕状态改变时立即响应。
AI助手已提取文章相关产品:

-- 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_ONSCREEN_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

    }

});

 



您可能感兴趣的与本文相关内容

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值