Android有关Home按键的TYPE

发布时间:2024-11-13 07:53

最新推荐文章于 2024-08-29 10:56:30 发布

wh_19910525 于 2013-08-10 13:06:19 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

先看到PhoneWindowManager中public boolean interceptKeyTi(WindowState win, int code, int metaKeys, boolean down, 
            int repeatCount, int flags) 这个方法的实现,interceptKeyTi你可以暂时理解为WindowManagerService中处理驱动和上层按键实现的过滤器

if (code == KeyEvent.KEYCODE_HOME) {                        WindowManager.LayoutParams attrs = win != null ? win.getAttrs() : null;       if (attrs != null) {           final int type = attrs.type;           if (type == WindowManager.LayoutParams.TYPE_KEYGUARD                   || type == WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG) {                              return false;           }           final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length;           for (int i=0; i<typeCount; i++) {               if (type == WINDOW_TYPES_WHERE_HOME_DOESNT_WORK[i]) {                                      return true;               }           }       }  

从上面的注释可以看到注释:// the "app" is keyguard, so give it the key ,就是说当在应用界面下的时候,按了HOME键而且当前应用的WindowManager.LayoutParams.type的值是WindowManager.LayoutParams.TYPE_KEYGUARD就让直接返回;返回做什么呢,我先告诉大家,这个interceptKeyTi方法被调用的地方的流程后续步骤就是根据这个interceptKeyTi的返回值来判断,如果返回的是false就让当前应用自己去做HOME键的业务处理通过类似下面的代码

     public boolean onKeyDown(int keyCode, KeyEvent event)     {         switch (keyCode)         {             case KeyEvent.KEYCODE_HOME:                 DisplayToast("HOME键按下");                 break;                    }         return super.onKeyDown(keyCode, event);        }               public boolean onKeyUp(int keyCode, KeyEvent event)     {         switch (keyCode)         {             case KeyEvent.KEYCODE_HOME:                 DisplayToast("HOME键弹起");                 break;                     }                  return super.onKeyUp(keyCode, event);     }  

这里就产生了疑问:一、WindowManager.LayoutParams.type的值是在应用的哪里初始化的,二、interceptKeyTi方法被调用的地方的流程后续步骤是怎么调应用的HOME键的处理方式的,三、interceptKeyTi方法被调用的地方的流程后续步骤是怎么获取到WindowManager.LayoutParams.type初始化的值的;这三个疑问基本上就是按键的一个流程即怎么通过底层驱动到Activity相应按键事件相应的。

下面我们来看第一个问题的解答:Activity中有两个可覆盖的方法,都可以做如下的初始化:

                                                               public void onWindowFocusChanged(boolean hasFocus) {           WindowManager.LayoutParams lp = new WindowManager.LayoutParams();           lp.type = WindowManager.LayoutParams.TYPE_KEYGUARD ;           this.getWindow().setAttributes(lp);       }                               public void onAttachedToWindow() {               this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);                 super.onAttachedToWindow();        }          onWindowFocusChanged(boolean) 当窗口包含的view获取或失去焦点时触发    onAttachedToWindow() 当view被附着到一个窗口时触发 
LayoutParams的构造方式有很多种可以顺带学习下,同时最好学习下它的参数,项目中用到就知道它的重要性了: public LayoutParams() {      super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);      type = TYPE_APPLICATION;      format = PixelFormat.OPAQUE;  }    public LayoutParams(int _type) {      super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);      type = _type;      format = PixelFormat.OPAQUE;  }    public LayoutParams(int _type, int _flags) {      super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);      type = _type;      flags = _flags;      format = PixelFormat.OPAQUE;  }    public LayoutParams(int _type, int _flags, int _format) {      super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);      type = _type;      flags = _flags;      format = _format;  }    public LayoutParams(int w, int h, int _type, int _flags, int _format) {      super(w, h);      type = _type;      flags = _flags;      format = _format;  }    public LayoutParams(int w, int h, int xpos, int ypos, int _type,          int _flags, int _format) {      super(w, h);      x = xpos;      y = ypos;      type = _type;      flags = _flags;      format = _format;  }   到这一步为至即为网上很多转的都一样的帖子即屏蔽Home键写一些自己的业务逻辑

网址:Android有关Home按键的TYPE https://www.yuejiaxmz.com/news/view/64766

相关内容

Type
Dumbbell Home Workout Premium「哑铃家庭锻炼」 v4.17 for Android 解锁高级版—— 在家就能通过哑铃锻炼来锻炼肌肉并增强力量
基于Android平台的记事本软件(Android Studio项目+报告+app文件)
CLUB HOME的1年 = 蓝城小镇 +13个月
疲惫男生必看!深度按摩+精油spa彻底放松
CSS小技巧——去除input[type=number]的默认样式
Android studio 中文乱码的解决办法
Android Studio实现简单的健身系统
Android程序设计 大作业:基于安卓的校园生活服务系统的设计与实现
【Android程序设计】 大作业:基于安卓的校园生活服务系统的设计与实现

随便看看