全网整合营销服务商

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

免费咨询热线: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 


相关文章: 已有域名和空间如何快速搭建网站?  香港服务器租用每月最低只需15元?  建站之星云端配置指南:模板选择与SEO优化一键生成  购物网站制作公司有哪些,哪个购物网站比较好?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  建站之星如何优化SEO以实现高效排名?  建站主机服务器选购指南:轻量应用与VPS配置解析  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  中山网站推广排名,中山信息港登录入口?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  常州自助建站工具推荐:低成本搭建与模板选择技巧  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  制作网站的模板软件,网站怎么建设?  如何快速生成高效建站系统源代码?  如何在服务器上三步完成建站并提升流量?  如何将凡科建站内容保存为本地文件?  如何高效完成独享虚拟主机建站?  建站之星代理费用多少?最新价格详情介绍  深入理解Android中的xmlns:tools属性  如何制作一个表白网站视频,关于勇敢表白的小标题?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  建站之星ASP如何实现CMS高效搭建与安全管理?  北京企业网站设计制作公司,北京铁路集团官方网站?  制作旅游网站html,怎样注册旅游网站?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  建站主机选哪种环境更利于SEO优化?  建站主机SSH密钥生成步骤及常见问题解答?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  如何有效防御Web建站篡改攻击?  如何用5美元大硬盘VPS安全高效搭建个人网站?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  C#如何序列化对象为XML XmlSerializer用法  建站之星图片链接生成指南:自助建站与智能设计教程  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  如何在腾讯云免费申请建站?  网站企业制作流程,用什么语言做企业网站比较好?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  音乐网站服务器如何优化API响应速度?  如何用西部建站助手快速创建专业网站?  常州自助建站费用包含哪些项目?  如何彻底卸载建站之星软件?  建站主机CVM配置优化、SEO策略与性能提升指南  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  如何在阿里云通过域名搭建网站?  江苏网站制作公司有哪些,江苏书法考级官方网站?  建站主机功能解析:服务器选择与快速搭建指南  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何选择高性价比服务器搭建个人网站? 

您的项目需求

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