全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android中Home键的监听和拦截示例

首先大家应该先了解一种情况,就是Android在应用中是无法拦截Home键的,今天我们带大家看一下Home键的三种情况。

1、在应用中按下Home键的逻辑处理

当我们在应用中按下Home键时界面会启动到桌面,我们在frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.Java类中可以看到其实现原理,其不外乎就是调用了以下代码。

  Intent mHomeIntent;
  mHomeIntent = new Intent(Intent.ACTION_MAIN, null);
  mHomeIntent.addCategory(Intent.CATEGORY_HOME);
  mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

  startActivity(mHomeIntent);

创建一个启动到桌面的Intent。

2、在应用中监听Home键

在Android应用中如果想监听Home键可以使用广播机制,这个在源码中也有体现。

static public final String SYSTEM_DIALOG_REASON_KEY = "reason";
  static public final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
  static public final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
  static public final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
  static public final String SYSTEM_DIALOG_REASON_ASSIST = "assist";

  @Override
  public void onReceive(Context arg0, Intent arg1) {
    String action = arg1.getAction();
    //按下Home键会发送ACTION_CLOSE_SYSTEM_DIALOGS的广播
    if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {

      String reason = arg1.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
      if (reason != null) {
        if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
          // 短按home键
          Toast.makeText(arg0, "短按Home键", Toast.LENGTH_SHORT).show();
        } else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
          // RECENT_APPS键
          Toast.makeText(arg0, "RECENT_APPS", Toast.LENGTH_SHORT).show();
        }
      }
    }
  }

这样就可以监听Home的是否被按下。

3、在Frameworks层拦截Home键

在frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java文件中我们首先看一下interceptKeyBeforeDispatching()方法。

public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {

  //......
  if (keyCode == KeyEvent.KEYCODE_HOME) {

    //......
    handleShortPressOnHome();
  }
}

//进入handleShortPressOnHome
private void handleShortPressOnHome() {
    // If there's a dream running then use home to escape the dream
    // but don't actually go home.
    if (mDreamManagerInternal != null && mDreamManagerInternal.isDreaming()) {
      mDreamManagerInternal.stopDream(false /*immediate*/);
      return;
    }

    // Go home!
    launchHomeFromHotKey();
  }

进入launchHomeFromHotKey方法。

static public final String SYSTEM_DIALOG_REASON_KEY = "reason";
  static public final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
  static public final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
  static public final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
  static public final String SYSTEM_DIALOG_REASON_ASSIST = "assist";

void launchHomeFromHotKey() {
    if (isKeyguardShowingAndNotOccluded()) {
      // don't launch home if keyguard showing
    } else if (!mHideLockScreen && mKeyguardDelegate.isInputRestricted()) {
      // when in keyguard restricted mode, must first verify unlock
      // before launching home
      mKeyguardDelegate.verifyUnlock(new OnKeyguardExitResult() {
        @Override
        public void onKeyguardExitResult(boolean success) {
          if (success) {
            try {
              ActivityManagerNative.getDefault().stopAppSwitches();
            } catch (RemoteException e) {
            }
            sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY);
            startDockOrHome();
          }
        }
      });
    } else {
      // no keyguard stuff to worry about, just launch home!
      try {
        ActivityManagerNative.getDefault().stopAppSwitches();
      } catch (RemoteException e) {
      }
      if (mRecentsVisible) {
        // Hide Recents and notify it to launch Home
        awakenDreams();
        sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY);
        hideRecentApps(false, true);
      } else {
        // Otherwise, just launch Home
        sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY);
        //启动Launcher界面
        startDockOrHome();
      }
    }
  }

以上方法可处理Home键的拦截操作,接下来我们进入startDockOrHome方法。

void startDockOrHome() {

    if (OptConfig.LC_RAM_SUPPORT) {
      try {
        ActivityManagerNative.getDefault().startHomePre();
      } catch (RemoteException re) {

      }
    }

    awakenDreams();

    Intent dock = createHomeDockIntent();
    if (dock != null) {
      try {
        startActivityAsUser(dock, UserHandle.CURRENT);
        return;
      } catch (ActivityNotFoundException e) {
      }
    }

    //intent的相关设置
    mHomeIntent = new Intent(Intent.ACTION_MAIN, null);
    mHomeIntent.addCategory(Intent.CATEGORY_HOME);
    mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
        | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

    startActivityAsUser(mHomeIntent, UserHandle.CURRENT);
  }

好啦,这里就对Home键进行简单的监听和拦截。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# android  # home键监听  # android拦截home键  # 安卓监听home键  # Android来电拦截的实现方法  # Android自动拦截与接听功能APK黑白名单  # 按下  # 看一下  # 也有  # 可以看到  # 三种  # 可以使用  # 当我们  # 就对  # 好啦  # 创建一个  # 大家多多  # 就可以  # 类中  # assist  # SYSTEM_DIALOG_REASON_ASSIST  # homekey  # Override  # Context  # onReceive  # void 


相关文章: 建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  如何通过FTP空间快速搭建安全高效网站?  定制建站方案优化指南:企业官网开发与建站费用解析  b2c电商网站制作流程,b2c水平综合的电商平台?  网站制作价目表怎么做,珍爱网婚介费用多少?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  Python如何创建带属性的XML节点  北京网站制作公司哪家好一点,北京租房网站有哪些?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  油猴 教程,油猴搜脚本为什么会网页无法显示?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  如何用PHP快速搭建CMS系统?  建站之星×万网:智能建站系统+自助建站平台一键生成  如何将凡科建站内容保存为本地文件?  公司网站设计制作厂家,怎么创建自己的一个网站?  建站VPS配置与SEO优化指南:关键词排名提升策略  建站之星下载版如何获取与安装?  北京专业网站制作设计师招聘,北京白云观官方网站?  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  公司网站的制作公司,企业网站制作基本流程有哪些?  建站之星安装路径如何正确选择及配置?  建站之星安装后界面空白如何解决?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  建站主机选哪家性价比最高?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  定制建站如何定义?其核心优势是什么?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  建站之星安全性能如何?防护体系能否抵御黑客入侵?  建站VPS选购需注意哪些关键参数?  威客平台建站流程解析:高效搭建教程与设计优化方案  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  如何选择CMS系统实现快速建站与SEO优化?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  建站之星备案是否影响网站上线时间?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  小程序网站制作需要准备什么资料,如何制作小程序?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  动图在线制作网站有哪些,滑动动图图集怎么做?  如何选择建站程序?包含哪些必备功能与类型?  存储型VPS适合搭建中小型网站吗?  网站app免费制作软件,能免费看各大网站视频的手机app?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  用v-html解决Vue.js渲染中html标签不被解析的问题  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  建站主机数据库如何配置才能提升网站性能? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。