Android之Home键监听

本文主要参照文章http://www.2cto.com/kf/201305/213348.html

应用可以监听返回键和菜单键,但是无法监听Home键,可能被framework拦截不让监听,但上文中实现了该功能,在此做个记录,对关键代码进行保存。

做桌面时对话框按home键不会消失,产品要求将对话框消失,

                               if(mAlignIconDialog == null) {
					AlertDialog.Builder builder = new AlertDialog.Builder(Launcher.this, AlertDialog.THEME_TRADITIONAL);
					builder.setTitle(R.string.dialog_align_icon_title);
					builder.setMessage(R.string.dialog_align_icon_content);
					builder.setNegativeButton(android.R.string.cancel, null);
					builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
						@Override
						public void onClick(DialogInterface dialog, int which) {
							// TODO Auto-generated method stub
							alignIcons();
						}
					});
					mAlignIconDialog = builder.create();
					mAlignIconDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
						@Override
						public boolean onKey(DialogInterface dialog, int keyCode,
								KeyEvent event) {
							if (keyCode == KeyEvent.KEYCODE_HOME){
								isAlignIconDialogOpen = true;
								dialog.dismiss();
								return true;
							}
							return false;
						}
					}); 
					//dlg.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 
					mAlignIconDialog.setCanceledOnTouchOutside(true);
				}
				mAlignIconDialog.show();



其中代码

dlg.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 

如果不注掉的话,setOnKeyListener是可以监听到home事件的,但进入锁屏后再点亮,在锁屏界面会看到该对话框,因此该方案行不通。

改用在onCreate中注册监听如下:

mHomeReceiver = new InnerHomeReceiver();  
IntentFilter  mHomeFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
registerReceiver(mHomeReceiver, mHomeFilter);
其中InnerHomeReceiver定义如下:

InnerHomeReceiver mHomeReceiver;
	class InnerHomeReceiver 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) {
					if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
						Log.e("HJJ", "short short home keydown");
						if(mAlignIconDialog != null && mAlignIconDialog.isShowing()) {
							isAlignIconDialogOpen = true;
							mAlignIconDialog.dismiss();
						}
						// 短按home键
					} else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
						Log.e("HJJ", "long long home keydown");
						// 长按home键
					}
				}
			}
		}
	}

另外在onDestory里面一定取消注册,否则会有内存泄露。

unregisterReceiver(mHomeReceiver);




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值