Android Home键监听的实现代码

 更新时间:2018年12月23日 09:26:04   转载 作者:Mr_MaChao  
这篇文章主要介绍了Android Home 键监听的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

之前的一个项目需要监听home键的事件,发现用dispatchKeyEvent无法实现监听,后来查了些资料,才知道home键不能用常规的按键事件监听,需要使用广播的方法。下面是我封装的一个工具类。根据自己实际需要修改吧。

注册广播:

HomeListener.getInstance().start(this);

移除广播

HomeListener.getInstance().stop(this);

设置监听回调

HomeListener.getInstance().setHomeKeylistener(HomePressListener listener);

添加监听回调

HomeListener.getInstance().addHomeKeyListener(HomePressListener listener)

移除监听回调

HomeListener.getInstance().removeHomeKeyListener(HomePressListener listener);

移除所有监听回调

HomeListener.getInstance().removeAllHomeKeyListener();

销毁

HomeListener.getInstance().destroy();

工具类代码:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;

public class HomeListener {
 public static HomeKeyListener getInstance() {
  HomeKeyListener listener = HomeKeyListener.sListener;
  listener.init();
  return listener;
 }

 static class HomeKeyListener {
  private static final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";//home键旁边的最近程序列表键
  private static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";//按下home键
  private static final String SYSTEM_DIALOG_REASON_ASSIST = "assist";//某些三星手机的程序列表键

  private static AtomicBoolean isDestroy = new AtomicBoolean(true);
  private static AtomicBoolean isRegister = new AtomicBoolean(false);
  private static HomeKeyListener sListener = new HomeKeyListener();
  private List<HomePressListener> mPressListeners = new ArrayList<HomePressListener>();
  private HomeReceiver mReceiver;
  private IntentFilter mHomeFileter;
  private HomePressListener mHomePressListener;
  public void init() {
   if (isDestroy.get()) {
    this.mPressListeners = new ArrayList<HomePressListener>();
    this.mReceiver = new HomeReceiver();
    this.mHomeFileter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
    isDestroy.set(false);
   }
  }

  public synchronized void start(Context context) {
   if (!isRegister.get()) {
    context.registerReceiver(mReceiver, mHomeFileter);
    isRegister.set(true);
   }
  }

  public synchronized void stop(Context context) {
   if (isRegister.get()) {
    context.unregisterReceiver(mReceiver);
    isRegister.set(false);
   }
  }

  public void setHomeKeylistener(HomePressListener listener) {
   this.mHomePressListener = listener;
  }

  public void addHomeKeyListener(HomePressListener listener) {
   mPressListeners.add(listener);
  }

  public void removeHomeKeyListener(HomePressListener listener) {
   mPressListeners.add(listener);
  }

  public void removeAllHomeKeyListener() {
   mPressListeners.clear();
  }

  public void destroy() {
   this.mPressListeners.clear();
   this.mPressListeners = null;
   this.mReceiver = null;
   this.mHomeFileter = null;
   this.mHomePressListener = null;
   isDestroy.set(true);
  }

  public interface HomePressListener {
   void onHomePress();
   void onHomeRecentAppsPress();
  }

  class HomeReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
    receive(intent);
   }
  }

  private void receive(Intent intent) {
   String action = intent.getAction();
   if (action != null && action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
    String reason = intent.getStringExtra( "reason" );
    dispatchPress(reason);
   }
  }

  private void dispatchPress(String reason) {
   switch (reason) {
    case SYSTEM_DIALOG_REASON_HOME_KEY:
     if (mHomePressListener != null) mHomePressListener.onHomePress();
     for (HomePressListener listener : mPressListeners) listener.onHomePress();
     break;

    case SYSTEM_DIALOG_REASON_RECENT_APPS:
    case SYSTEM_DIALOG_REASON_ASSIST:
     if (mHomePressListener != null) mHomePressListener.onHomeRecentAppsPress();
     for (HomePressListener listener : mPressListeners) listener.onHomeRecentAppsPress();
     break;

   }
  }
 }
}

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

相关文章

  • Java基于状态模式实现的文档编辑模式切换功能实例

    Java基于状态模式实现的文档编辑模式切换功能实例

    这篇文章主要介绍了Java基于状态模式实现的文档编辑模式切换功能,结合实例形式详细分析了状态模式的概念、原理及java使用状态模式实现文档编辑模式切换操作相关技巧与注意事项,需要的朋友可以参考下
    2018-05-05
  • javaweb上传下载实例完整版解析(下)

    javaweb上传下载实例完整版解析(下)

    这篇文章主要为大家详细解析了javaweb上传下载实例,本文重点在于文件下载功能的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Maven入门之使用Nexus搭建Maven私服及上传下载jar包

    Maven入门之使用Nexus搭建Maven私服及上传下载jar包

    这篇文章主要介绍了Maven入门之使用Nexus搭建Maven私服及上传下载jar包,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Java实现计算器的代码

    Java实现计算器的代码

    这篇文章主要为大家介绍了Java实现计算器的详细代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Java编程基于快速排序的三个算法题实例代码

    Java编程基于快速排序的三个算法题实例代码

    这篇文章主要介绍了Java编程基于快速排序的三个算法题实例代码,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • java字符串相似度算法

    java字符串相似度算法

    这篇文章主要介绍了java字符串相似度算法,是Java实现比较典型的算法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • SpringBoot中的五种对静态资源的映射规则的实现

    SpringBoot中的五种对静态资源的映射规则的实现

    这篇文章主要介绍了SpringBoot中的五种对静态资源的映射规则的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • java实现中英文混合字符截取方法

    java实现中英文混合字符截取方法

    这篇文章主要为大家详细介绍了java实现中英文混合字符的截取方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • Spring Boot启动时调用自己的非web逻辑

    Spring Boot启动时调用自己的非web逻辑

    在spring Boot中,有些代码是WEB功能,例如API等,但是有些逻辑是非WEB,启动时就要调用并持续运行的,该如何加载自己的非WEB逻辑呢,下面通过实例代码给大家讲解,一起看看吧
    2017-07-07
  • 深入理解final变量的初始化

    深入理解final变量的初始化

    本篇文章是对final变量的初始化进行了详细的分析介绍,需要的朋友参考下
    2013-06-06

最新评论