Android

Android通过.nomedia文件禁止多媒体库扫描指定文件夹下的多媒体文件 Android应用内存泄露分析、改善经验总结 修改Eclipse导入项目的默认工程名 自定义Android Studio工程模板 使用Nexus Repository搭建属于自己公司的私有maven服务器 Android Studio编译过程中mergeDebugResources时报“png-cruncher_*”异常的解决方案 Eclipse转Android Studio的过程中有必要弄明白的一些问题 Android开发经验总结 Android Studio使用过程中遇到的一些问题及解决方案 Android各个Support Library介绍 调用AsyncTask的excute方法不能立即执行程序的原因分析及改善方案 提升进入界面的速度 使用软引用解决Handler内存泄露和显示Popupwindow、Dialog时提示"Unable to add Window-token is null"的问题 SharedPreferences在多进程中的使用及注意事项 Android性能测试工具列表 Android View双缓冲绘制时清除Bitmap上的内容的方法 解决JPinyin在APK被加密后不能正常使用的问题 Android APP内存优化之图片优化 Android EditText的使用及值得注意的地方 Android应用内多进程的使用及注意事项 Android设置应用内文字的默认颜色和大小 关于APK瘦身值得分享的一些经验 Android通过ClipDrawable实现图片裁剪功能 Android通过广播更新文件和文件夹到媒体库 每个Android开发者都应该了解的资源列表 selector的使用方法及注意事项 通过批处理批量clone代码 Android清除数据、清除缓存、一键清理的区别 Android将数据库保存到SD卡的实现 Android多分辨率适配经验总结 通过观察者模式监听媒体库的变化实现APP本地数据自动更新 Android ADB命令大全(通过ADB命令查看wifi密码、MAC地址、设备信息、操作文件、查看文件、日志信息、卸载、启动和安装APK等) Android通过ADB查看wifi密码 Android一个APK多个入口(多个桌面图标)的实现 使用Python脚本批量卸载第三方应用和清除log缓存 Android CheckList Android模仿打字机效果的自定义View实现 在Activity的onCreate方法中显示PopupWindow导致异常的原因分析及解决方案 Android手写优化-更为平滑的签名效果实现 Android手写优化-平滑的签名效果实现 不要在Android的Application对象中缓存数据! 大量Android面试题目来袭 一种不需要Google账号、不需要关联手机、不需要在手机上安装Google的服务直接能够下载Google Play上APK的方法 在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案 Android程序和数据分离的实现方案 按Home按键退出应用后重新启动该应用无法返回到最后打开页面的解决方案 Eclipse下Android项目不能生成R.java的解决方法汇总 android:descendantFocusability属性在ListView中的妙用 去掉SrollView、GrdiView、ListView、ViewPager等滑动到边缘的光晕效果 Android开发经验谈-Eclipse使用技巧 Android开发经验谈-很少有人会告诉你的Android开发基本常识 Android开发经验谈-Android工程目录介绍 在Android的string.xml中使用转义字符实现想要的显示效果 修改ViewPager调用setCurrentItem时,滑屏的速度 Android监听Home按键消息 Android手写开源项目和资料搜集 Android通过资源文件名获取资源ID Android中Bitmap、Drawable、bytes数组之间相互转换 想过但未实现的一些Idea 读写文件编码方式不一致导致文件乱码的解决方案 Android字符串格式化开源库phrase介绍 Android实现带箭头的自定义Progressbar Android模拟键盘输入功能的实现 与Android应用程序相关的各种文件存储路径介绍 Android开发者网址导航

标签

Android 65

Android通过.nomedia文件禁止多媒体库扫描指定文件夹下的多媒体文件 Android应用内存泄露分析、改善经验总结 修改Eclipse导入项目的默认工程名 自定义Android Studio工程模板 使用Nexus Repository搭建属于自己公司的私有maven服务器 Android Studio编译过程中mergeDebugResources时报“png-cruncher_*”异常的解决方案 Eclipse转Android Studio的过程中有必要弄明白的一些问题 Android开发经验总结 Android Studio使用过程中遇到的一些问题及解决方案 Android各个Support Library介绍 调用AsyncTask的excute方法不能立即执行程序的原因分析及改善方案 提升进入界面的速度 使用软引用解决Handler内存泄露和显示Popupwindow、Dialog时提示"Unable to add Window-token is null"的问题 SharedPreferences在多进程中的使用及注意事项 Android性能测试工具列表 Android View双缓冲绘制时清除Bitmap上的内容的方法 解决JPinyin在APK被加密后不能正常使用的问题 Android APP内存优化之图片优化 Android EditText的使用及值得注意的地方 Android应用内多进程的使用及注意事项 Android设置应用内文字的默认颜色和大小 关于APK瘦身值得分享的一些经验 Android通过ClipDrawable实现图片裁剪功能 Android通过广播更新文件和文件夹到媒体库 每个Android开发者都应该了解的资源列表 selector的使用方法及注意事项 通过批处理批量clone代码 Android清除数据、清除缓存、一键清理的区别 Android将数据库保存到SD卡的实现 Android多分辨率适配经验总结 通过观察者模式监听媒体库的变化实现APP本地数据自动更新 Android ADB命令大全(通过ADB命令查看wifi密码、MAC地址、设备信息、操作文件、查看文件、日志信息、卸载、启动和安装APK等) Android通过ADB查看wifi密码 Android一个APK多个入口(多个桌面图标)的实现 使用Python脚本批量卸载第三方应用和清除log缓存 Android CheckList Android模仿打字机效果的自定义View实现 在Activity的onCreate方法中显示PopupWindow导致异常的原因分析及解决方案 Android手写优化-更为平滑的签名效果实现 Android手写优化-平滑的签名效果实现 不要在Android的Application对象中缓存数据! 大量Android面试题目来袭 一种不需要Google账号、不需要关联手机、不需要在手机上安装Google的服务直接能够下载Google Play上APK的方法 在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案 Android程序和数据分离的实现方案 按Home按键退出应用后重新启动该应用无法返回到最后打开页面的解决方案 Eclipse下Android项目不能生成R.java的解决方法汇总 android:descendantFocusability属性在ListView中的妙用 去掉SrollView、GrdiView、ListView、ViewPager等滑动到边缘的光晕效果 Android开发经验谈-Eclipse使用技巧 Android开发经验谈-很少有人会告诉你的Android开发基本常识 Android开发经验谈-Android工程目录介绍 在Android的string.xml中使用转义字符实现想要的显示效果 修改ViewPager调用setCurrentItem时,滑屏的速度 Android监听Home按键消息 Android手写开源项目和资料搜集 Android通过资源文件名获取资源ID Android中Bitmap、Drawable、bytes数组之间相互转换 想过但未实现的一些Idea 读写文件编码方式不一致导致文件乱码的解决方案 Android字符串格式化开源库phrase介绍 Android实现带箭头的自定义Progressbar Android模拟键盘输入功能的实现 与Android应用程序相关的各种文件存储路径介绍 Android开发者网址导航

Android监听Home按键消息

2014年12月05日

  Android对屏幕下方常用的四个按键消息处理是不一致的:

  • 搜索按键的消息在onKeyDown或者onKeyUp中接收;
  • 菜单按键的消息在onCreateOptionsMenu、onKeyDown或onKeyUp方法中接收;
  • 返回按键的消息可以在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后,按其它按钮没有比按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;
}