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;

   }
  }
 }
}

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

(0)

相关推荐

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

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

  • 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

  • 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键和Back键的区别介绍

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

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

    首先大家应该先了解一种情况,就是Android在应用中是无法拦截Home键的,今天我们带大家看一下Home键的三种情况. 1.在应用中按下Home键的逻辑处理 当我们在应用中按下Home键时界面会启动到桌面,我们在frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.Java类中可以看到其实现原理,其不外乎就是调用了以下代码. Intent mHomeIntent; mHomeIntent =

  • Android监听home键的方法详解

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

  • 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键监听的实现代码

    之前的一个项目需要监听home键的事件,发现用dispatchKeyEvent无法实现监听,后来查了些资料,才知道home键不能用常规的按键事件监听,需要使用广播的方法.下面是我封装的一个工具类.根据自己实际需要修改吧. 注册广播: HomeListener.getInstance().start(this); 移除广播 HomeListener.getInstance().stop(this); 设置监听回调 HomeListener.getInstance().setHomeKeyliste

  • Android电池电量监听的示例代码

    监听电池状态只需要接收Intent.ACTION_BATTERY_CHANGED的广播即可,当电池状态发生变化时会发出广播. 1.运行状态如下图: 1.充电中的状态 2.未充电时的状态 2.实现代码如下,各个状态通过名字就很容易知道意思,BatteryManager类中定义了电池状态. public class MainActivity extends Activity { private static final String TAG = "MainActivity"; privat

  • android短信监听工具(示例代码)

    在学习本实例之前,读者请先了解一下android四大组件中的"广播接收者"的基本概念和使用. 由于是"监听程序",所以就不需要建立Activity.这样也算是一种"遮掩"吧.使用BroadcastReceiver,就能达到这"不可告人"的目的.呵呵.当然,使用服务来开发此类应用,更加合适.这里就不再深入讨论"服务"了.本实例仅供学习参考,请勿非法用途. 复制代码 代码如下: package cn.itcas

  • Android 屏幕切换监听的实例代码

    昨天,我试着在屏幕切换时,使View显示在不同的位置,在网上搜索了一些资料,自己做了一段时间,终于完成了功能. 由于屏幕切换会调用activity的各个生命周期,所以需要在manifest的activity属性加上代码 android:configChanges="keyboardHidden|orientation|screenSize|locale|layoutDirection" 然后重写onConfigurationChanged(),加上自己的处理代码 @Override p

  • Android App内监听截图加二维码功能代码

    Android截屏功能是一个常用的功能,可以方便的用来分享或者发送给好友,本文介绍了如何实现app内截屏监控功能,当发现用户在我们的app内进行了截屏操作时,进行对图片的二次操作,例如添加二维码,公司logo等一系列*. 项目地址 测试截图: 截屏原理 android系统并没有提供截屏通知相关的API,需要我们自己利用系统能提供的相关特性变通实现.Android系统有一个媒体数据库,每拍一张照片,或使用系统截屏截取一张图片,都会把这张图片的详细信息加入到这个媒体数据库,并发出内容改变通知,我们可

  • Android 7.0 监听网络变化的示例代码

    Android7.0前,Android系统前网络切换时,会发广播,业务只要监听广播即可. public class NetChangeReceiver extends BroadcastReceiver { private static final String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; @Override public void onReceive(Context conte

  • Android 中的监听和按键处理详情

    目录 各种监听 按键处理 onKeyDown() onBackPressed() Fragment中监听Back返回键 各种监听 我们来练习下各种监听.我们在 TextView 上添加了触摸监听,在 Button 上添加了长按监听,在 Spinner 下拉框选项发生变化的时候添加了监听,在 ListView 选中选项时增加了监听. xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  • Android实现信号强度监听的方法

    信号强度的监听是Android手机十分常见的一个重要功能.今天本文就以实例展示Android实现信号强度监听的方法.分享给大家供大家参考. 具体实现代码如下: TelephonyManager Tel; MyPhoneStateListener MyListener; /* Update the listener, and start it */ MyListener = new MyPhoneStateListener(); Tel = (TelephonyManager) getSystem

  • android截图事件监听的原理与实现

    Android系统没有对用户截屏行为提供回调的api,所以我们只能走野路子来获取用户是否截屏了.一般大家都会采用如下两种方法 1.监听截屏图片所在目录变化(FileObserver) 2.监听媒体库的变化(ContentObserver) 上面两种方法均不是万能的,需要结合使用才能达到良好的效果,首先看看如何监控目录 在android中,我们可以通过FileObserver来监听目录变化,先来看看如何使用 private static final File DIRECTORY_PICTURES

  • Android 动态注册监听网络变化实例详解

    Android 动态注册监听网络变化实例详解 新建一个BroadcastTest项目,然后修改MainActivity中的代码,如下: public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle

随机推荐