发布于 2017-09-25 20:44:06 | 17 次阅读 | 评论: 0 | 来源: 网友投递

这里有新鲜出炉的精品教程,程序狗速度看过来!

Android移动端操作系统

Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。


本篇文章主要介绍了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键进行简单的监听和拦截。

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



相关阅读 :
Android中Home键的监听和拦截示例
Android应用中Back键的监听及处理实例
Android中home键和back键区别实例分析
Android中应用前后台切换监听的实现详解
android中使用Activity实现监听手指上下左右滑动
Android应用开发:电话监听和录音代码示例
Android中给按钮同时设置背景和圆角示例代码
Android中封装RecyclerView实现添加头部和底部示例代码
Android中监听Home键的4种方法总结
Android 解决监听home键的几种方法
Android监听home键的方法详解
Android应用开发中模拟按下HOME键的效果(实现代码)
最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务