本文主要是介绍android 4.0 屏蔽 HOME_KEY 和 RECENT_APP_KEY,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在项目中需要屏蔽虚拟按键,back 和menu键可以屏蔽,但是HOME_KEY 和 RECENT_APP_KEY 却无法屏蔽,在 onKeyDown(int keyCode, KeyEvent event) 方法中不能捕获HOME_KEY 和 RECENT_APP_KEY 的动作。
1、屏蔽HOME_KEY
参考网站http://www.2cto.com/kf/201207/138886.html
在/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java(拦截消息的处理类)
的interceptKeyBeforeDispatching() 方法中做修改
public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000;
// If a system window has focus, then it doesn't make sense// right now to interact with applications.WindowManager.LayoutParams attrs = win != null ? win.getAttrs() : null;if (attrs != null) {final int type = attrs.type;if (type == WindowManager.LayoutParams.TYPE_KEYGUARD|| type == WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG) {// the "app" is keyguard, so give it the keyreturn 0;}final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length;for (int i=0; i<typeCount; i++) {if (type == WINDOW_TYPES_WHERE_HOME_DOESNT_WORK[i]) {// don't do anything, but also don't pass it to the appreturn -1;}}//以下条件屏蔽HOMEKEYfinal int flag = attrs.flags;if ((flag & FLAG_HOMEKEY_DISPATCHED) != 0){Log.i(TAG, "============ FLAG_HOMEKEY_DISPATCHED");return 0;}}
在应用中设置以下代码
public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000;
public void onAttachedToWindow() {getWindow().addFlags(FLAG_HOMEKEY_DISPATCHED);super.onAttachedToWindow();
}
并在onKeyDown(int keyCode, KeyEvent event) 中返回true。屏蔽了HOME键。
2、屏蔽RECENT_APP_KEY
在PhoneWindowManager.java(拦截消息的处理类) 的interceptKeyBeforeDispatching() 方法中,RECENT_APP_KEY的事件不能截取。屏蔽RECENT_APP_KEY只能另想办法。
参考http://blog.csdn.net/yihongyuelan/article/details/7623578
在/frameworks/base/packages/SystemUI 中的TabletStatusBar.java (平板的StatusBar)。发现在类中存在一个广播类,添加一个屏蔽的动作和一个取消屏蔽的动作。达到通过广播去控制recentApp的动作是否响应。
protected View makeStatusBarView() {......// receive broadcastsIntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);filter.addAction(Intent.ACTION_SCREEN_OFF);//增加开关动作filter.addAction(ACTION_DISABLE_RECENT_BUTTON);filter.addAction(ACTION_ENABLE_RECENT_BUTTON);context.registerReceiver(mBroadcastReceiver, filter);return sb;
}private boolean disableRecentButton = false;private static final String ACTION_DISABLE_RECENT_BUTTON = "action_disable_recent_button";private static final String ACTION_ENABLE_RECENT_BUTTON = "action_enable_recent_button";private View.OnClickListener mOnClickListener = new View.OnClickListener() {public void onClick(View v) {if (v == mRecentButton) {if (!disableRecentButton) {//recentApp 动作处理onClickRecentButton();}} else if (v == mInputMethodSwitchButton) {onClickInputMethodSwitchButton();} else if (v == mCompatModeButton) {onClickCompatModeButton();}}
};private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {public void onReceive(Context context, Intent intent) {String action = intent.getAction();if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)|| Intent.ACTION_SCREEN_OFF.equals(action)) {boolean excludeRecents = false;if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {String reason = intent.getStringExtra("reason");if (reason != null) {excludeRecents = reason.equals("recentapps");}}if (Intent.ACTION_SCREEN_OFF.equals(action)) {// If we're turning the screen off, we want to hide the// recents panel with no animation// TODO: hide other things, like the notification tray,// with no animation as wellmRecentsPanel.show(false, false);excludeRecents = true;}animateCollapse(excludeRecents);} //增加开关动作else if (ACTION_DISABLE_RECENT_BUTTON.equals(action)){disableRecentButton = true;} else if (ACTION_ENABLE_RECENT_BUTTON.equals(action)){disableRecentButton = false;}}};
最后在应用中添加以下代码就可以屏蔽了RECNET_APP_KEY
private static final String ACTION_DISABLE_RECENT_BUTTON = "action_disable_recent_button";private static final String ACTION_ENABLE_RECENT_BUTTON = "action_enable_recent_button";@Overrideprotected void onResume() {super.onResume();Intent intent = new Intent(ACTION_DISABLE_RECENT_BUTTON);sendBroadcast(intent);}@Overrideprotected void onPause() {Intent intent = new Intent(ACTION_ENABLE_RECENT_BUTTON);sendBroadcast(intent);super.onPause();}
这篇关于android 4.0 屏蔽 HOME_KEY 和 RECENT_APP_KEY的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!