Android通过Intent.ACTION_CLOSE_SYSTEM_DIALOGS监听Home按键消息
Android对屏幕下方经常使用的四个按键消息处理是不一致的:
1、搜索按键的消息在onKeyDown或者onKeyUp中接收;
2、菜单按键的消息在onCreateOptionsMenu、onKeyDown或onKeyUp方法中接收;
3、返回按键的消息能够在onBackPressed、onKeyDown或onKeyUp方法中接收。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch( keyCode ){
case KeyEvent.KEYCODE_BACK:{ }
break;
case KeyEvent.KEYCODE_MENU:{ }
break;
case KeyEvent.KEYCODE_SEARCH:{ }
break;
default:{ }
break;
}
return super.onKeyDown(keyCode, event);
} @Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch( keyCode ){
case KeyEvent.KEYCODE_BACK:{ }
break;
case KeyEvent.KEYCODE_MENU:{ }
break;
case KeyEvent.KEYCODE_SEARCH:{ }
break;
default:{ }
break;
}
return super.onKeyUp(keyCode, event);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
return true;
} @Override
public void onBackPressed() {
super.onBackPressed();
}
对于Home按键消息的处理,既不能通过onKeyDown、onKeyUp接收到,android也没有提供专有的方法接收按键消息,个人预计home按键算是一个app异常信息处理的后门,比方ANR后,按其他button没有比按Home按键好使。所以android为了可以提供更好的用户体验,没有提供供用户监听home按键消息的方法。
注:网上提供了各种各样监听Home按键消息的方法,但仅仅有这个比較好使。
但办法总是有的,在每次点击Home按键时都会发出一个action为Intent.ACTION_CLOSE_SYSTEM_DIALOGS的广播,它是关闭系统Dialog的广播,我们能够通过注冊它来监听Home按键消息。我自己定义了一个home按键监听工具类。代码例如以下。使用说明參见类名上方的使用说明:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter; /**
* Home按键监听类
* 使用说明:
* 1、初始化HomeListen
* HomeListen homeListen = new HomeListen( this );
* homeListen.setOnHomeBtnPressListener( new setOnHomeBtnPressListener(){
* @Override
* public void onHomeBtnPress( ){
* // 按下Home按键回调
* }
*
* @Override
* public void onHomeBtnLongPress( ){
* // 长按Home按键回调
* }
* });
*
* 2、在onResume方法中启动HomeListen广播:
* homeListen.start();
*
* 3、在onPause方法中停止HomeListen广播:
* homeListen.stop( );
* */
public class HomeListen {
public HomeListen(Context context) {
mContext = context;
mHomeBtnReceiver = new HomeBtnReceiver( );
mHomeBtnIntentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
} public void setOnHomeBtnPressListener( OnHomeBtnPressLitener onHomeBtnPressListener ){
mOnHomeBtnPressListener = onHomeBtnPressListener;
} public void start( ){
mContext.registerReceiver( mHomeBtnReceiver, mHomeBtnIntentFilter );
} public void stop( ){
mContext.unregisterReceiver( mHomeBtnReceiver );
} class HomeBtnReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
receive( context, intent );
}
} private void receive(Context context, Intent intent){
String action = intent.getAction();
if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
String reason = intent.getStringExtra( "reason" );
if (reason != null) {
if( null != mOnHomeBtnPressListener ){
if( reason.equals( "homekey" ) ){
// 按Home按键
mOnHomeBtnPressListener.onHomeBtnPress( );
}else if( reason.equals( "recentapps" ) ){
// 长按Home按键
mOnHomeBtnPressListener.onHomeBtnLongPress( );
}
}
}
}
} public interface OnHomeBtnPressLitener{
public void onHomeBtnPress( );
public void onHomeBtnLongPress( );
} private Context mContext = null;
private IntentFilter mHomeBtnIntentFilter = null;
private OnHomeBtnPressLitener mOnHomeBtnPressListener = null;
private HomeBtnReceiver mHomeBtnReceiver = null;
}
在Activity中做例如以下调用就可以:
public class HomeListenActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home_listen_layout);
initHomeListen( );
}
@Override
protected void onResume( ) {
super.onResume();
mHomeListen.start( );
}
@Override
protected void onPause() {
super.onPause();
mHomeListen.stop( );
}
private void initHomeListen( ){
mHomeListen = new HomeListen( this );
mHomeListen.setOnHomeBtnPressListener( new OnHomeBtnPressLitener( ) {
@Override
public void onHomeBtnPress() {
showToast( "按下Home按键!" );
}
@Override
public void onHomeBtnLongPress() {
showToast( "长按Home按键!" );
}
});
}
private void showToast( String toastInfoStr ){
Toast.makeText( this, toastInfoStr, Toast.LENGTH_LONG ).show( );
}
private HomeListen mHomeListen = null;
}
Android通过Intent.ACTION_CLOSE_SYSTEM_DIALOGS监听Home按键消息的更多相关文章
- android监听虚拟按键的显示与隐藏【转】
本文转载自:http://blog.csdn.net/u014583590/article/details/55263141 虚拟按键在华为手机中大量存在,而虚拟按键的存在无疑增加了屏幕适配的难度,往 ...
- Android Back Home键监听
Android Back Home键监听 Back键的监听 对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back键按下的事件: @Overrid ...
- Android EditText截获与监听输入事件
Android EditText截获与监听输入事件共有2种方法: 1.第一种方法:使用setOnKeyListener(),不过这种方式只能监听硬键盘事件. edittext.setOnKeyLi ...
- Android App用MulticastSocket监听组播,为什么连接到不同路由、在不同手机上跑,有的能收到有的收不到
---------------------------!! 转载请注明出处 !!----------------------- 一个项目,利用wifi组播在局域网内发现设备.却发现在有的路由器上能 ...
- Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果
转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17761431),请尊重他人的辛勤劳动成果,谢谢! 我之前写 ...
- JS监听组合按键
有些时候,我们需要在网页上,增加一些快捷按键,方便用户使用一些常用的操作,比如:保存,撤销,复制.粘贴等等. 下面简单梳理一下思路: 我们所熟悉的按键有这么集中类型: 单独的按键操作,如:delete ...
- Dom监听组合按键
JS监听组合按键 有些时候,我们需要在网页上,增加一些快捷按键,方便用户使用一些常用的操作,比如:保存,撤销,复制.粘贴等等. 下面简单梳理一下思路: 我们所熟悉的按键有这么集中类型: 单独的按键 ...
- 【转】keyCode对照表及JS监听组合按键
原文: http://blog.csdn.net/qq_21386275/article/details/67640576 有一些需求,html 页面上的input 框只允许输入数字, 只允许输入小 ...
- 92. extjs specialkey监听回车按键
转自:http://blog.sina.com.cn/s/blog_647a022e0101401n.html 1 监听表单字段事件: Ext使得对用户某个动作的监听特别简单,诸如单击某个元素或者按下 ...
随机推荐
- FH Admin
http://www.360doc.com/content/14/0713/08/8072791_394027312.shtml
- 使用 `ConfigMap` 挂载配置文件
使用 ConfigMap 挂载配置文件 Intro 有一些敏感信息比如数据库连接字符串之类的出于安全考虑,这些敏感信息保存在了 Azure KeyVault 中,最近应用上了 k8s 部署,所以想把 ...
- Linux Shell Scripting Cookbook 读书笔记 5
sed,awk 1. sed (string editor) 使用-i可以将结果运用于原文件 sed 's/text1/text2/' file > newfile mv newfile fil ...
- linux编译安装ccache3.2.4
1.下载ccache3.2.4安装包 #cd /opt #wget http://samba.org/ftp/ccache/ccache-3.2.4.tar.gz 2.解压 #.tar.gz 3.创建 ...
- Boolean占几个字节
Boolean:1.1bit 2.1byte 3.4byte 简书地址: http://www.jianshu.com/p/2f663dc820d0 官网地址: http://docs. ...
- Oracle数据库实例
数据库通常由两部分组成:数据库和数据库实例 数据库与实例的关系:数据库指的是:物理数据.数据库管理系统.即物理数据.内存.操作系统.用户访问Oracle都是访问一个实例,实例名指的是用于相应某个数据库 ...
- 记一个男默女泪的 BUG
姗姗来迟的词频统计代码 BUG 的发现 1. 此前提交的第一次代码作业总结博客 http://www.cnblogs.com/ustczwq/p/8680704.html 2. BUG 本天成,妙手偶 ...
- sql中数据库连接与断开式连接有什么区别?
连接式指的是对数据的操作在 conn.Open() 与 conn.Close()之间: 断开式连接指的是 conn.Open()打开连接之后,先将数据放入adapter中,然后关闭连接(conn.Cl ...
- 如何选择优动漫PAINT版本?是个人版还是EX版
优动漫PAINT也就是我们常说的clip studio paint(CSP)的中文版本,它是一款功能强大的动漫绘图软件,适用于个人和专业团队创作,分为个人版和EX版.搭载了绘制漫画和插画所需的所有功能 ...
- Linux date命令的用法(转)
1.命令:date 2.命令功能:date 可以用来显示或设定系统的日期与时间. 3.命令参数 -d<字符串>:显示字符串所指的日期与时间.字符串前后必须加上双引号: -s<字符串& ...