zoukankan      html  css  js  c++  java
  • Android之Home键监听封装

    众所周知,我们监听返回键事件,无法是下面两个方法:

    @Override  
        public void onBackPressed() {  
            //do something  
            //super.onBackPressed();  
        }  
          
        @Override  
        public boolean onKeyDown(int keyCode, KeyEvent event) {  
            if(keyCode == KeyEvent.KEYCODE_BACK){  
                //do something  
            }  
            return super.onKeyDown(keyCode, event);  
        }  
    View Code

    于是乎,我们理所当然的想到,监听Home键的方法是:if(keyCode == KeyEvent.KEYCODE_HOME)。

    但实际上,这样是行不通的,因为此时home键的消息在framework层就已经被拦截,所以,我们在应用中通过此方法是无法监听到Home键的消息的。

    那么我们如何捕获Home键事件,并作出相应处理呢?其实系统还是给我们发出广播的,下面,就跟大家分享一下,封装好了的监听Home键的方法:

    HomeWatcher类:

    /** 
     * Home键监听封装 
     *  
     * @author way 
     *  
     */  
    public class HomeWatcher {  
      
        static final String TAG = "HomeWatcher";  
        private Context mContext;  
        private IntentFilter mFilter;  
        private OnHomePressedListener mListener;  
        private InnerRecevier mRecevier;  
      
        // 回调接口  
        public interface OnHomePressedListener {  
            public void onHomePressed();  
      
            public void onHomeLongPressed();  
        }  
      
        public HomeWatcher(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();  
                            }  
                        }  
                    }  
                }  
            }  
        }  
    }  
    接下来,我们需要在应用中开启监听,下面是以在Activity中的应用为例:
    /** 
     * 应用HomeWatcher小例 
     *  
     * @author way 
     *  
     */  
    public class MainActivity extends Activity {  
        private static final String TAG = "MainActivity";  
        private HomeWatcher mHomeWatcher;  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_main);  
      
            mHomeWatcher = new HomeWatcher(this);  
            mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {  
                @Override  
                public void onHomePressed() {  
                    Log.e(TAG, "onHomePressed");  
                }  
      
                @Override  
                public void onHomeLongPressed() {  
                    Log.e(TAG, "onHomeLongPressed");  
                }  
            });  
            mHomeWatcher.startWatch();  
        }  
      
        @Override  
        protected void onPause() {  
            super.onPause();  
            mHomeWatcher.stopWatch();// 在onPause中停止监听,不然会报错的。  
        }  
    }  
    View Code
  • 相关阅读:
    全面监测网站信息
    linux 将Mysql的一张表导出至Excel格式文件
    渗透测试人员发现用户可无限输入密码次数,超过5次未锁定用户,存在暴力破解风险。解放方案:限制每个输入的用户名(不管存不存在该账户)登陆失败次数不超过5次,超过则锁定该用户
    mysql linux下数据库导出 常用操作
    find php.ini 和 php的执行目录 bin目录
    解决:The “https://packagist.laravel-china.org/packages.json” file could not be downloaded
    如何上传代码至GitHub
    7. Jmeter-逻辑控制器介绍与使用
    19、Linux命令对服务器内存进行监控
    20、Linux命令对服务器磁盘进行监控
  • 原文地址:https://www.cnblogs.com/weixing/p/3413933.html
Copyright © 2011-2022 走看看