本文主要参照文章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中注册监听如下:
其中InnerHomeReceiver定义如下:mHomeReceiver = new InnerHomeReceiver(); IntentFilter mHomeFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); registerReceiver(mHomeReceiver, mHomeFilter);
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);