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键进行简单的监听和拦截。

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

(0)

相关推荐

  • Android应用开发中模拟按下HOME键的效果(实现代码)

    下面提供代码示例,请参考. 复制代码 代码如下: public boolean onKeyDown(int keyCode, KeyEvent event) {      if (keyCode == KeyEvent.KEYCODE_BACK) {          Intent intent = new Intent(Intent.ACTION_MAIN);          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);          i

  • Android 屏蔽和捕获Home键的示例代码

    在Level5以上(包含)中,Activity类中的方法:public void onAttachedToWindow ()就能对Home键进行捕获. 具体代码如下: MainActivity.java package com.lingdududu.test; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.view.WindowManager;

  • Android监听Home键实例详解

    本文实例讲述了Android监听Home键的方法.分享给大家供大家参考,具体如下: 将到android中Home键的监听,很多人第一反应时重写相应Activity的onKeyDown()方法,监听当按下的键的keyCode为KEYCODE_HOME时,进行自己的相应的处理.如: @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_HOME) { stop

  • Android 解决监听home键的几种方法

    Android 解决监听home键的几种方法 前言: 以下两种方法可以完美解决监听back键,home键,多任务键(最近任务键). 一.使用注册广播监听home键.多任务键 演示图 创建一个广播代码如下: class InnerRecevier extends BroadcastReceiver { final String SYSTEM_DIALOG_REASON_KEY = "reason"; final String SYSTEM_DIALOG_REASON_RECENT_APP

  • Android监听Home键和Back键的区别介绍

    一:Android 中Home键监听和Back键监听的区别: (1).在Android中,当按下Home键的时候,默认情况下Stop前台的Activity,即Activity设置成停止状态[onStop()],而不是销毁状态[onDestory()].如果再次启动该Activity,不是调用onCreate()方法,而是调用onSavedInstanceState方法.则是从onRestart()开始-onStart()-onResume(). (2).当按下back键则不同,back键默认fi

  • Android4.0.x Home键事件拦截监听的方法

    本文实例讲述了Android4.0.x Home键事件拦截监听的方法.分享给大家供大家参考,具体如下: 在2.3.x 的主要做法如下,具体实现网上有很多文章 @Override public void onAttachedToWindow() { this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); super.onAttachedToWindow(); } 代码移植到4.0.1后 this.getWindow()

  • Android编程实现Home键的屏蔽,捕获与修改方法

    本文实例讲述了Android编程实现Home键的屏蔽,捕获与修改方法.分享给大家供大家参考,具体如下: 个人补充:此方法需要加权限,而且修改后拦截了home键,所以建议慎用~ 开发过程中相信大家都曾有碰到因为不能捕获Home键而烦恼,现在终于有办法了,在Level5以上(包含)中,Activity类中有如下方法: public void onAttachedToWindow () Since: API Level 5 Called when the main window associated

  • Android编程模拟HOME键功能示例

    本文实例讲述了Android编程模拟HOME键功能的方法.分享给大家供大家参考,具体如下: 做一个类似于QQ按返回键并不销毁Activity的方法(即不调用Activity.finish(),系统不调用 onDestroy),而是类似于按Home键,让Activity类似于"暂停"(即只调用onPause,onDestroy). 代码如下: public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == Key

  • Android中监听Home键的4种方法总结

    昨天需要处理一个问题,需要监听home键.最开始想到使用onKeydonwn这个方法.但是发现home不能这样处理,onKeydonwn可以处理菜单键和back键,但home不能.因为home键是系统键,情况特殊一些. 看了一下网上的资料,说下面的方法可以.(其实不行) 复制代码 代码如下: @Override     public void onAttachedToWindow() {         // TODO Auto-generated method stub         Log

  • Android监听home键的方法详解

    本文实例分析了Android监听home键的方法.分享给大家供大家参考,具体如下: 如何知道Home按钮被点击了呢?做launcher的时候,看源代码发现原因 如果你的Activity具备这些属性 <activity android:name="com.woyou.activity.HomeActivity" android:launchMode="singleInstance" > <intent-filter> <action an

  • android4.0屏蔽HOME键的简单实现

    在android2.2 2.3中可以通过在activity中重写 复制代码 代码如下: @Override public void onAttachedToWindow() {this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);super.onAttachedToWindow(); } 这个函数屏蔽Home键. android4.0后这个方法就不能用了.下边是android4.0之后屏蔽Home键的方法. 复制代码

  • android里面屏蔽home键/禁止Home键或者随你DIY

    可以先禁止Home键,再在onKeyDown里处理按键值,点然后在击Home键的时候就把程序关闭,或者随你DIY. 复制代码 代码如下: @Override public boolean onKeyDown(int keyCode, KeyEvent event){ if(KeyEvent.KEYCODE_HOME==keyCode) android.os.Process.killProcess(android.os.Process.myPid()); return super.onKeyDow

随机推荐