android home键广播监听,Android 监听Home键

这篇博客介绍了一种通过动态注册广播接收器来监听Android系统Home键的方法。作者指出,由于系统层面的Home键事件被框架截获,无法在onKeyDown中直接捕获,因此建议使用监听系统关闭对话框的广播来实现。这种方法可以在整个应用中接收到Home键的短按和长按事件,从而实现自定义功能。
摘要由CSDN通过智能技术生成

网上有很多监听home键的方法但是有很多都监听不到,今天总结一个相对来说比较方便和简单的方法。

当用户点击系统层级的按键的时候都会发出系统广播,这个时候我们只要register相应的广播就可以获取当相应事件了,需要注意的是,静态注册不可以~~只能在代码里面动态注册!我是在application里面直接注册,这样在整个app中都能接收到。

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.util.Log;

public class HomeKeyListener{

static final String TAG = "HomeKeyWatcher";

private Context mContext;

private IntentFilter mFilter;

private OnHomePressedListener mListener;

private HomeKeyRecevier mRecevier;

// 回调接口

public interface OnHomePressedListener {

public void onHomePressed();

public void onHomeLongPressed();

}

public HomeKeyListener(Context context) {

mContext = context;

mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);

}

/**

* 设置监听

*

* @param listener

*/

public void setOnHomePressedListener(OnHomePressedListener listener) {

mListener = listener;

mRecevier = new HomeKeyRecevier();

}

/**

* 开始监听,注册广播

*/

public void startWatch() {

if (mRecevier != null) {

mContext.registerReceiver(mRecevier, mFilter);

}

}

/**

* 停止监听,注销广播

*/

public void stopWatch() {

if (mRecevier != null) {

mContext.unregisterReceiver(mRecevier);

}

}

/**

* 广播接收者

*/

class HomeKeyRecevier extends BroadcastReceiver {

final String SYSTEM_DIALOG_REASON_KEY = "reason";

final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";

final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";

final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

@Override

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {

String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);

if (reason != null) {

Log.e(TAG, "action:" + action + ",reason:" + reason);

if (mListener != null) {

if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {

// 短按home键

mListener.onHomePressed();

} else if (reason

.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {

// 长按home键

mListener.onHomeLongPressed();

}

}

}

}

}

}

}

在application中注册

public class OBDApplication extends Application{

private HomeKeyWatcher HomeKeyListener;

@Override

public void onCreate() {

super.onCreate();

}

private void initHomeKeyListener() {

HomeKeyListener = new HomeKeyListener(this);

HomeKeyListener.setOnHomePressedListener(new HomeKeyWatcher.OnHomePressedListener() {

@Override

public void onHomePressed() {

WindowUtils.hidePopupWindow();

}

@Override

public void onHomeLongPressed() {

}

});

HomeKeyListener.startWatch();

}

@Override

public void onTerminate() {

super.onTerminate();

HomeKeyListener.stopWatch();

}

}

像网上有很多说监听home键在onKeyDown中判断KeyEvent.ACTION_DOWN (KEYCODE_HOME)直接就可以获取相应的监听,但是,我试了一下,根本拦截不到,查找了一下原因

/** Key code constant: Home key.

* This key is handled by the framework and is never delivered to applications. */

public static final int KEYCODE_HOME = 3;

原因

这个事件直接被framework层给截获了,never delivered!!永远不会传递的application层!!!,所以在onKeyDown处理是拿不到事件的!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值