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使得对用户某个动作的监听特别简单,诸如单击某个元素或者按下 ...
随机推荐
- 杂项-JAVA:MVP
ylbtech-杂项-JAVA:MVP 简称:MVP 全称:Model-View-Presenter :MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Pres ...
- [Pulgin] jQuery插件之ajaxFileUpload
一.ajaxFileUpload是一个异步上传文件的jQuery插件. 传一个不知道什么版本的上来,以后不用到处找了. 语法:$.ajaxFileUpload([options]) options参数 ...
- 乐字节-Java8核心特性实战-接口默认方法
JAVA8已经发布很久,是自java5(2004年发布)之后Oracle发布的最重要的一个版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性,对于国内外互联网公司来说,Java8是以后技术 ...
- Java设计模式-策略模式详解
前言 在软件领域中,设计模式作为一种经典的开发实践常常需要我们去深入的理解,而策略模式作为设计模式的一种,使用频率也是相对来说比较高的,在Java中,当我们学习TreeSet集合的时候,就采用了经典的 ...
- C++数字图像处理(1)-伽马变换
https://blog.csdn.net/huqiang_823/article/details/80767019 1.算法原理 伽马变换(幂律变换)是常用的灰度变换,是一种简单的图像增强算法 ...
- RocketMQ之消息中间件需要解决的问题
消息中间件需要解决哪些问题 1.Publish/Subscribe(发布订阅) 发布订阅是消息中间件最基本的功能 2.Message Priority(消息优先级) 在消息队列中,每条消息都有不同的优 ...
- CUDA与OpenCL架构
CUDA与OpenCL架构 目录 CUDA与OpenCL架构 目录 1 GPU的体系结构 1.1 GPU简介 1.2 GPU与CPU的差异 2 CUDA架构 2.1 硬件架构 2.1.1 GPU困境 ...
- jquey中的事件绑定
三种方法: $(selector).live(events, data, handler); // jQuery 1.3+ $(document).delegate(se ...
- Verilog之openMSP430(1)
openMSP430_IO interrupt Verilog file: omsp_gpio.v //================================================ ...
- 基于Linux/C++简单线程池的实现
我们知道Java语言对于多线程的支持十分丰富,JDK本身提供了很多性能优良的库,包括ThreadPoolExecutor和ScheduleThreadPoolExecutor等.C++11中的STL也 ...