您的位置:首页 > 移动开发 > Android开发

有关Android屏幕监听的问题

2015-07-01 13:49 483 查看
在Android开发过程中,经常需要监听屏幕的状态,熄屏、亮屏不同的状态,需要 做不同的处理。下面就将项目用到有关屏幕监听的部分介绍一下,水平有限,不好之处望见谅!

public class ScreenListener {

    private Context mContext;

    private ScreenBroadcastReceiver mScreenReceiver;

    private ScreenStateListener mScreenStateListener;

    public ScreenListener(Context context) {

        mContext = context;

        mScreenReceiver = new ScreenBroadcastReceiver();

    }

    /**

     * screen状态广播接收者

     */

    private class ScreenBroadcastReceiver extends BroadcastReceiver {

        private String action = null;

        @Override

        public void onReceive(Context context, Intent intent) {

            action = intent.getAction();

            if (Intent.ACTION_SCREEN_ON.equals(action)) { // 屏幕亮

                mScreenStateListener.onScreenOn();

            } else if (Intent.ACTION_SCREEN_OFF.equals(action)) { // 屏幕灭

                mScreenStateListener.onScreenOff();

            } else if (Intent.ACTION_USER_PRESENT.equals(action)) { // 屏幕解锁

                mScreenStateListener.onUserPresent();

            }

        }

    }

    /**

     * 开始监听screen状态

     * 

     */

    public void begin(ScreenStateListener listener) {

        mScreenStateListener = listener;

        registerListener();

        getScreenState();

    }

    /**

     * 获取screen状态

     */

    private void getScreenState() {

        PowerManager manager = (PowerManager) mContext

                .getSystemService(Context.POWER_SERVICE);

        if (manager.isScreenOn()) {

            if (mScreenStateListener != null) {

                mScreenStateListener.onScreenOn();

            }

        } else {

            if (mScreenStateListener != null) {

                mScreenStateListener.onScreenOff();

            }

        }

    }

    /**

     * 注销屏幕监听

     */

    public void unregisterListener() {

        mContext.unregisterReceiver(mScreenReceiver);

    }

    /**

     * 注册屏幕监听广播,必须要动态注册,因为PowerManager类中做了显示,否则不起作用。

     */

    private void registerListener() {

        IntentFilter filter = new IntentFilter();

        filter.addAction(Intent.ACTION_SCREEN_ON);

        filter.addAction(Intent.ACTION_SCREEN_OFF);

        filter.addAction(Intent.ACTION_USER_PRESENT);

        mContext.registerReceiver(mScreenReceiver, filter);

    }

    public interface ScreenStateListener {//显示屏幕状态接口,供调用者自己使用 

        public void onScreenOn();

        public void onScreenOff();

        public void onUserPresent();

    }

}

以上是屏幕监听的一个类,其中最主要的方法有两个,一个是开始监听的方法,另一个是注销监听的方法。这两个方法分别在初始化监听的时候、应用退出的时候调用。还包括一个动态注册的广播接收者。该广播必须要动态注册才能生效,因为在PowerManager类中做了限制,在配置文件中注册不起作用。一个显示屏幕状态的接口,供调用者自己使用。

在Activity中,screenListener = new ScreenListener(this);新建一个listener对象,然后调用begin方法,开始监听。

screenListener.begin(new ScreenStateListener() {

            @Override

            public void onUserPresent() {

                Log.e("onUserPresent", "onUserPresent");

            }

            @Override

            public void onScreenOn() {//未锁屏,并且surfaceview销毁,mediaPlayer没有销毁

                Log.i("Allen", "解锁屏");

                if(numScreenOn>0){

                isScreen = true;

                }

                numScreenOn++;

                

            }

            @Override

            public void onScreenOff() {

                Log.i("Allen", "锁屏了");

                

            }

        });

注意,在应用退出的时候,一定要注销掉广播接收者,否则容易引发其他不必要的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: