Android Home 键监听

作者: mm_cuckoo | 来源:发表于2018-12-14 15:58 被阅读3次

之前的一个项目需要监听home键的事件,发现用dispatchKeyEvent无法实现监听,后来查了些资料,才知道home键不能用常规的按键事件监听,需要使用广播的方法。下面是我封装的一个工具类。根据自己实际需要修改吧。

  1. 注册广播:
HomeListener.getInstance().start(this);
  1. 移除广播
HomeListener.getInstance().stop(this);
  1. 设置监听回调
HomeListener.getInstance().setHomeKeylistener(HomePressListener listener);
  1. 添加监听回调
HomeListener.getInstance().addHomeKeyListener(HomePressListener listener)
  1. 移除监听回调
HomeListener.getInstance().removeHomeKeyListener(HomePressListener listener);
  1. 移除所有监听回调
HomeListener.getInstance().removeAllHomeKeyListener();
  1. 销毁
HomeListener.getInstance().destroy();

工具类代码:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;

public class HomeListener {
    public static HomeKeyListener getInstance() {
        HomeKeyListener listener = HomeKeyListener.sListener;
        listener.init();
        return listener;
    }

    static class HomeKeyListener {
        private static final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";//home键旁边的最近程序列表键
        private static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";//按下home键
        private static final String SYSTEM_DIALOG_REASON_ASSIST = "assist";//某些三星手机的程序列表键

        private static AtomicBoolean isDestroy = new AtomicBoolean(true);
        private static AtomicBoolean isRegister = new AtomicBoolean(false);
        private static HomeKeyListener sListener = new HomeKeyListener();
        private List<HomePressListener> mPressListeners = new ArrayList<HomePressListener>();
        private HomeReceiver mReceiver;
        private IntentFilter mHomeFileter;
        private HomePressListener mHomePressListener;
        public void init() {
            if (isDestroy.get()) {
                this.mPressListeners = new ArrayList<HomePressListener>();
                this.mReceiver = new HomeReceiver();
                this.mHomeFileter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
                isDestroy.set(false);
            }
        }

        public synchronized void start(Context context) {
            if (!isRegister.get()) {
                context.registerReceiver(mReceiver, mHomeFileter);
                isRegister.set(true);
            }
        }

        public synchronized void stop(Context context) {
            if (isRegister.get()) {
                context.unregisterReceiver(mReceiver);
                isRegister.set(false);
            }
        }

        public void setHomeKeylistener(HomePressListener listener) {
            this.mHomePressListener = listener;
        }

        public void addHomeKeyListener(HomePressListener listener) {
            mPressListeners.add(listener);
        }

        public void removeHomeKeyListener(HomePressListener listener) {
            mPressListeners.add(listener);
        }

        public void removeAllHomeKeyListener() {
            mPressListeners.clear();
        }

        public void destroy() {
            this.mPressListeners.clear();
            this.mPressListeners = null;
            this.mReceiver = null;
            this.mHomeFileter = null;
            this.mHomePressListener = null;
            isDestroy.set(true);
        }

        public interface HomePressListener {
            void onHomePress();
            void onHomeRecentAppsPress();
        }

        class HomeReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                receive(intent);
            }
        }

        private void receive(Intent intent) {
            String action = intent.getAction();
            if (action != null && action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
                String reason = intent.getStringExtra( "reason" );
                dispatchPress(reason);
            }
        }

        private void dispatchPress(String reason) {
            switch (reason) {
                case SYSTEM_DIALOG_REASON_HOME_KEY:
                    if (mHomePressListener != null) mHomePressListener.onHomePress();
                    for (HomePressListener listener : mPressListeners) listener.onHomePress();
                    break;

                case SYSTEM_DIALOG_REASON_RECENT_APPS:
                case SYSTEM_DIALOG_REASON_ASSIST:
                    if (mHomePressListener != null) mHomePressListener.onHomeRecentAppsPress();
                    for (HomePressListener listener : mPressListeners) listener.onHomeRecentAppsPress();
                    break;

            }
        }
    }
}

相关文章

  • Android监听home键(附带广播的使用)

    如果想监听home键,实现方式有几种第一种方式:Android 对home键的监听,加上了权限,必须取得对处理ho...

  • 【Android 进阶】Android Home 键监听

    Android Home键监听 Android 普通键值可以直接在dispatchKeyEvent()中处理,但H...

  • Android HOME键点击监听实现及思考

    Android手机HOME键的监听一直是个很头疼的问题,系统禁止用户重写HOME键的监听方法,就导致部分手机可能出...

  • Android 监听Home键

    网上有很多监听home键的方法但是有很多都监听不到,今天总结一个相对来说比较方便和简单的方法。 当用户点击系统层级...

  • Android监听home键

    1、在需要监听home键的activity添加广播,生成一个成员变量: private final Broadca...

  • Android 监听 Home 键

  • Android Home 键监听

    之前的一个项目需要监听home键的事件,发现用dispatchKeyEvent无法实现监听,后来查了些资料,才知道...

  • Android 监听Home 键

    对于Home键的监听不是那么容易,因为Home键可以将程序退出放在后台,所以这个事件是直接分发给系统,系统接收到之...

  • Android监听Home键

    调用时注意: 在初始化调用(如onCreate)时添加如下代码: 在程序销毁时(如:onDestroy)时添加如下代码:

  • android监听home键按钮

    关于home键的监听,下面的方法是不管用的, 当然正常的BACK还是可以用的 解决办法就是按home键,系统会发送...

网友评论

    本文标题:Android Home 键监听

    本文链接:https://www.haomeiwen.com/subject/zbughqtx.html