zoukankan      html  css  js  c++  java
  • [置顶] ANDROID 返回,菜单和HOME键的监听

    ------网上找了很多资料,项目中使用,最后将经验总结如下:

    1,返回和菜单键是可以直接重写onKeyDown(int keyCode, KeyEvent event) 方法监听:

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) { // 监控/拦截/屏蔽返回键
    //do something
    } else if (keyCode == KeyEvent.KEYCODE_MENU) {

    //do something
    } else if (keyCode == KeyEvent.KEYCODE_HOME) {

    //这里操作是没有返回结果的
    }
    return super.onKeyDown(keyCode, event);
    }

    在do something 中,如果返回false则时间不继续传递,也就是不会触发相应的后续事件

    2,如果是Home事件,看网上的说法,是底层拦截了这个事件,但是拦截后会发出一个广播。所以注册个广播接收HOME按键事件就行了。

    /**
     * Home键监听封装
     * 
     * 
     */ 
    public class HomeListener { 
     
        static final String TAG = "HomeListener"; 
        private Context mContext; 
        private IntentFilter mFilter; 
        private OnHomePressedListener mListener; 
        private InnerRecevier mRecevier; 
     
        // 回调接口  
        public interface OnHomePressedListener { 
            public void onHomePressed(); 
     
            public void onHomeLongPressed(); 
        } 
     
        public HomeListener(Context context) { 
            mContext = context; 
            mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
        } 
     
        /**
         * 设置监听
         * 
         * @param listener
         */ 
        public void setOnHomePressedListener(OnHomePressedListener listener) { 
            mListener = listener; 
            mRecevier = new InnerRecevier(); 
        } 
     
        /**
         * 开始监听,注册广播
         */ 
        public void startWatch() { 
            if (mRecevier != null) { 
                mContext.registerReceiver(mRecevier, mFilter); 
            } 
        } 
     
        /**
         * 停止监听,注销广播
         */ 
        public void stopWatch() { 
            if (mRecevier != null) { 
                mContext.unregisterReceiver(mRecevier); 
            } 
        } 
     
        /**
         * 广播接收者
         */ 
        class InnerRecevier extends BroadcastReceiver { 
            final String SYSTEM_DIALOG_REASON_KEY = "reason"; 
            final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions"; 
            final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"; 
            final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; 
     
            @Override 
            public void onReceive(Context context, Intent intent) { 
                String action = intent.getAction(); 
                if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { 
                    String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); 
                    if (reason != null) { 
    //                    Log.e(TAG, "action:" + action + ",reason:" + reason); 
                        if (mListener != null) { 
                            if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) { 
                                // 短按home键  
                                mListener.onHomePressed(); 
                            } else if (reason 
                                    .equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) { 
                                // 长按home键  
                                mListener.onHomeLongPressed(); 
                            } 
                        } 
                    } 
                } 
            } 
        } 

    在使用的时候:


    private HomeListener mHomeWatcher;

    在oncreate()中:

    mHomeWatcher = new HomeListener(this); 
            mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() { 
                @Override 
                public void onHomePressed() { 
                if(null!=vibrator){
        vibrator.cancel();
        }
        if(null!=timer){
        timer.cancel();
        }
                } 
                @Override 
                public void onHomeLongPressed() { 
                if(null!=vibrator){
        vibrator.cancel();
        }
        if(null!=timer){
        timer.cancel();
        }
                } 
            }); 
            mHomeWatcher.startWatch(); 

    在onpause()方法中:

    mHomeWatcher.stopWatch();


  • 相关阅读:
    机器学习中的度量——其他度量
    机器学习中的度量——相似度
    机器学习中的度量——相关系数
    机器学习中的度量——统计上的距离
    redis数据结构和常用命令
    分布式一致性算法梳理
    zookeeper集群搭建及ZAB协议
    手写RPC框架(netty+zookeeper)
    zookerper入门、核心概念和使用场景
    RabbitMQ集群部署、高可用和持久化
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3186985.html
Copyright © 2011-2022 走看看