草庐IT

Android拦截HOME键

天残神功 2023-04-29 原文

Android拦截按键

文章目录

Android拦截HOME按键

拦截HOME按键需要修改Android的framework层

  • 具体代码文件路径android/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

PhoneWindowManager的interceptKeyBeforeDispatching方法,这个方法对按键事件做了二次拦截
当返回值为-1则说明事件被拦截,返回值为0则说明事件放开执行。

举例在某个APP中屏蔽对应的HOME按键;

  • 如下代码为识别当前的APP是哪个?
public String getTopActivity(Context context){                                                                                                            
         ActivityManager am = (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE);
          ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
          Log.d(TAG, "pkg:" + cn.getPackageName() + " cls:"+cn.getClassName());//包名加类名
          return cn.getClassName();
     }

public boolean isBackgroundActivity(Context context, String packageName) {
          ActivityManager am = (ActivityManager) context.getSystemService("activity");
         List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
          if (!tasks.isEmpty()) {
              ComponentName topActivity = ((ActivityManager.RunningTaskInfo) tasks.get(0)).topActivity;
              Log.w(TAG, "topActivity packageName = " + topActivity.getPackageName());
              if (!topActivity.getPackageName().equals(packageName)) {
                  Log.w(TAG, packageName + " is background!");
                  return true;
              }
          }
          Log.w(TAG, packageName + " is foreground!");
          return false;
     }
  • 如下代码判断针对对应的APP进行HOME按键拦截:
/** {@inheritDoc} */
     @Override
     public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
......
// First we always handle the home key here, so applications
         // can never break it, although if keyguard is on, we do let
         // it handle it, because that gives us the correct 5 second
         // timeout.
        if (keyCode == KeyEvent.KEYCODE_HOME) {
 
             // If we have released the home key, and didn't do anything else
             // while it was pressed, then it is time to go home!
             if (!down) {
                 //添加的判断当前前台运行APP代码
                 if (!isBackgroundActivity(mContext, PKG_NAME_xxxxx)) {
                         Log.d(TAG, "xxxx app is foreground");
                         if (!getTopActivity(mContext).equals(ACTIVITY_NAME_xxxx)) {                                                          
                                 Log.d(TAG, "xxxxx app is foreground activity");
                                 return -1;
                         }
                        return -1;
                 }
                 
 
                 cancelPreloadRecentApps();

                 mHomePressed = false;
                 if (mHomeConsumed) {
                     mHomeConsumed = false;
                     return -1;
                 }
                 ......

备注:
直接在onKeyDown中判断通过keyCode == KeyEvent.KEYCODE_HOME是不能拦截的

Android拦截BACK按键

这个在Activity中自行重写回调即可,具体见如下示意代码:

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK){
        	//按键按下时返回处理逻辑可以放在这里
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK){
             //按键释放时返回处理逻辑可以放在这里
            return true;
        }
        return super.onKeyUp(keyCode, event);
    }

注:在onKeyDown或onKeyUp中使用return true或return false,都会拦截掉返回按键。

有关Android拦截HOME键的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. ruby-on-rails - 如何找出拦截 'method_missing' 的内容 - 2

    使用Ruby1.8.6/Rails2.3.2我注意到在我的任何ActiveRecord模型类上调用的任何方法都返回nil而不是NoMethodError。除了烦人之外,这还破坏了动态查找器(find_by_name、find_by_id等),因为即使存在记录,它们也总是返回nil。不从ActiveRecord::Base派生的标准类不受影响。有没有办法追踪在ActiveRecord::Base之前拦截method_missing的是什么?更新:切换到1.8.7后,我发现(感谢@MichaelKohl)will_paginate插件首先处理method_missing。但是will_pa

  3. ruby - 警告 : PATH set to RVM ruby but GEM_HOME and/or GEM_PATH not set, 请参阅 : https://github. com/wayneeseguin/rvm/issues/3212 - 2

    我每次打开终端时都会收到这个错误:警告:PATH设置为RVMruby​​但未设置GEM_HOME和/或GEM_PATH,请参阅:https://github.com/wayneeseguin/rvm/issues/3212这是在我最近安装zsh(oh-my-zsh)后开始发生的我不知道如何设置GEM_HOME和/或GEM_PATH的路径。 最佳答案 我也面临同样的问题,更改.zshrc中的以下行,exportPATH="/usr/local/heroku/bin:.........."到exportPATH="$PATH:/usr/

  4. ruby - 由于 GEM_HOME 的要求,启动 Ruby 应用程序非常慢 - 2

    我目前正在开发一个ruby​​应用程序,但它运行得非常(非常!)慢..到目前为止,我已经尝试了几件事,我可以将其缩小到主要问题:Ruby正在尝试在$LOAD_PATH的每个目录中查找它的需求。基本上我所观察到的是,ruby正在查看大量文件,试图查看那里是否存在需求。如果找不到它们,它将转到下一个目录。好消息是我可以通过strace看到这种情况。有很多这样的输出:open("/boa_proj_build/nsteen/.gem/gems/i18n-0.7.0/lib/commander/help_formatters/base.rb",O_RDONLY|O_CLOEXEC)=-1ENO

  5. ruby-on-rails - Rails 错误 : Unable to access log file. 请确保/home.../log/development.log 存在并且是 chmod 0666 - 2

    我正在尝试将db2数据库迁移到RubyonRails,但是当我运行railsgscaffold时,我得到了这个:Rails错误:无法访问日志文件。请确保/home/.../log/development.log存在并且是chmod0666。日志级别已提高到WARN,输出定向到STDERR,直到问题得到解决。我检查过,我的development.log不存在!我不确定为什么,因为我在安装过程中遵循了每一步,但我的文件仍然不存在。我怎样才能创建它?我已经尝试卸载并重新安装Rails,但问题仍然存在。 最佳答案 也许只做它要求你做的事?:

  6. ruby - 错误 "non-absolute home"通过网络 :SSH - 2

    有问题的代码Net::SSH.start('servername','user')这将返回“非绝对主页”。“用户”实际上有一个主目录。一种建议的方法是使用IdentityFile的完整路径修改~/.ssh/config。这并没有解决问题。其中最疯狂的部分是,如果通过irb或控制台调用,代码可以正常工作。当我们尝试从类方法(使用相同的代码)中调用它时,它会返回“非绝对主页”错误。“用户”也可以通过命令行ssh进入服务器而不会出现问题。服务器正在运行Ubuntu。更新感谢@Phrogz-解决方法是将ENV['HOME']设置为'/home/deploy'。但是,我还没有弄清楚为什么$HOM

  7. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  8. Android 10.0 设置默认launcher后安装另外launcher后默认Launcher失效的功能修复 - 2

    1.前言 在10.0的系统rom定制化开发中,在系统中有多个launcher的时候,会在开机进入launcher的时候弹窗launcher列表,让用户选择进入哪个launcher,这样显得特别的不方便所以产品开发中,要求用RoleManager的相关api来设置默认Launcher,但是在设置完默认Launcher以后,在安装一款Launcher的时候,默认Launcher就会失效,在系统设置的默认应用中Launcher选项就为空,点击home键的时候会弹出默认Launcher列表,让选择进入哪个默认Launcher.所以需要从安装Launcher的流程来分析相关的设置。来解决问题设置默认La

  9. ruby-on-rails - PostgreSQL gem for rails 不会安装,即使同时安装了 home brew 和 app - 2

    我试过按照这个answer让gem工作,但它不会。我设置了我的项目,这样各个项目都有自己的gem,而不是生活在全局空间中的所有主题gem,然后我使用binstubs来允许我做bin/rails.因此,每个项目的所有gem都安装到.bundle/gems/。总是给我带来最棘手问题的是posgresql。让我们完成这些步骤。所以我跑:bundle它爆炸说:Gem::Installer::ExtensionBuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Ver

  10. AiBote 2022 新研发的自动化框架,支持 Android 和 Windows 系统。速度非常快 - 2

    Ai-Bot基于流行的Node.js和JavaScript语言的一款新自动化框架,支持Windows和Android自动化。1、Windowsxpath元素定位算法支持支持Windows应用、.NET、WPF、Qt、Java和Electron客户端程序和ie、edgechrome浏览器2、Android支持原生APP和H5界面,元素定位速度是appium十倍,无线远程自动化操作多台安卓设备3、基于opencv图色算法,支持找图和多点找色,1080*2340全分辨率找图50MS以内4、内置免费OCR人工智能技术,无限制获取图片文字和找字功能。5、框架协议开源,除官方node.jsSDK外,用户可

随机推荐