在项目中需要屏蔽虚拟按键,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 key                    return 0;                }                final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length;                for (int i=0; i

在应用中设置以下代码

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 broadcasts        IntentFilter 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 well                    mRecentsPanel.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();}


更多相关文章

  1. Android之NDK开发 Android(安卓)studio 篇
  2. android有了eventbus,一切与关界面通信问题迎刃而解。
  3. Android(安卓)WebView 与 原生的交互
  4. Android(安卓)四种异步操作UI界面的方法
  5. Android(安卓)Root方法原理解析及Hook(四) GingerBreak
  6. Android在非UI线程中更新UI的方法
  7. Android中从网络获取数据的方法
  8. Android(安卓)Cocos2d-x游戏集成友盟社会化组件分享功能
  9. android 日记log保存到本地简单方法

随机推荐

  1. Android(安卓)工程混淆后无法找到自定义
  2. Android(安卓)Handler(四)
  3. Android之传感器(一)
  4. 一种巧妙获取Android状态栏高度的办法
  5. Cocos2dx杂记:仿Android提示Toast
  6. 14天学会安卓开发(第十天)Android网络与
  7. 在eclipse创建android 工程
  8. Android开发学习
  9. 今天的小收获
  10. Android核心分析(链接)