最近项目有这样的需要所以研究了一下着块的内容.....刚开始在度娘了一大堆 要么支持2.3之前的要么是...反正都是这个复制那个没么卵用的办法.. 我想先说明一点 想在应用上彻底屏蔽Home是不可能,要想屏蔽只能去改系统源码。好了,下面就看是怎么改的 首先改第一处: 源码位置在frameworks\base\services\core\ Java \com\ Android \server\wm\WindowManagerService.java relayoutWindow方法中找到这一段  if (attrs != null) {                 if (win.mAttrs.type != attrs.type) {                     Slog.e(TAG, "Window : " + win + "changes the window type!!");                     Slog.e(TAG, "Original type : " + win.mAttrs.type);                     Slog.e(TAG, "Changed type : " + attrs.type);                     throw new IllegalArgumentException(                             "Window type can not be changed after the window is added.");                 }
百度上有一种方法是复写 @Override public void onAttachedToWindow() {         this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);         super.onAttachedToWindow();     } 这种方法原来的确是可以的,但是由于安全方面的原因,google已经屏蔽这个方法了,一用就会报错,要想不会报错,我们就要注释掉这里
接下来修改第二处: 源码位置在frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java 在interceptKeyBeforeDispatching方法找到if (keyCode == KeyEvent.KEYCODE_HOME)时的处理  if (keyCode == KeyEvent.KEYCODE_HOME) {             // If we have released the home key, and didn't do anything else             // while it was pressed, then it is time to  Go  home!             if (!down) {                 cancelPreloadRecentApps();                 mHomePressed = false;                 if (mHomeConsumed) {                     mHomeConsumed = false;                     return -1;                 }                 if (canceled) {                     Log.i(TAG, "Ignoring HOME; event canceled.");                     return -1;                 }                 // Delay handling home if a double-tap is possible.                 if (mDoubleTapOnHomeBehavior != DOUBLE_TAP_HOME_NOTHING) {                     mHandler.removeCallbacks(mHomeDoubleTapTimeoutRunnable); // just in case                     mHomeDoubleTapPending = true;                     mHandler.postDelayed(mHomeDoubleTapTimeoutRunnable,                             ViewConfiguration.getDoubleTapTimeout());                     return -1;                 }                 handleShortPressOnHome();                 return -1;             }
 WindowManager.LayoutParams attrs = win != null ? win.getAttrs() : null;             if (attrs != null) {                 final int type = attrs.type;                 if (type == WindowManager.LayoutParams.TYPE_KEYGUARD_SCRIM                         || type == WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG                         || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) {                     // 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                     if (type == WINDOW_TYPES_WHERE_HOME_DOESNT_WORK[i]) {                         // don't do anything, but also don't pass it to the app                         return -1;                     }                 }             } 看到这段系统会先判断窗口的类型,然后再通过handleShortPressOnHome();这个方法去返回到桌面,这就好办了,我们刚第一步已经把 WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG这个类型给开放出来了..只需要加个标记去判断要不要返回到主界面就可以了,这样子改
1:首先加个是否回到桌面的标记  2:在要返回桌面的方法进行判断(true 返回桌面,false 不返回桌面并发送广播) 3:加个类型判断当时这个类型时我们让标记为false
到此位置我们源码的改动就完成了,最后上层要用的话只需要在要屏蔽Home键的当前Activity中复写onAttachedToWindow
@Override public void onAttachedToWindow() {         this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);         super.onAttachedToWindow();     }


//需要的话自己在这个地方再加个接收这个home键发出的广播 }  


涉及到的改动的java文件下载地址(已改动)

http://download.csdn.net/detail/u013286571/9902565

更多相关文章

  1. Android模拟器正确应用与安装方法
  2. Android之EasyPermissions源码解析
  3. Objective-C与JavaScript交互的那些事
  4. android中关于使用scrollview嵌套LinearLayout,页面滚动条不到底
  5. Android中程序向桌面和Launcher添加快捷方式【安卓进化三十二】
  6. 第一篇技术贴(Android(安卓)WebView)
  7. Android(安卓)TV Launcher 桌面导航
  8. Android学习路线总结
  9. Android:剖析源码,随心所欲控制Toast显示

随机推荐

  1. Jquery Validate 相关参数及常用的自定义
  2. BootStrap入门教程 (四)
  3. 分享27款非常棒的 jQuery 表单插件
  4. JavaScript函数中的Ruby代码
  5. 如何从Python脚本向jQuery发送JSON对象?
  6. 通过],[和创建json对象来分割字符串
  7. 开发学习Jquery实例---双击表格弹出模态
  8. 使用jQuery的ASP.NET - POST vs GET
  9. Ajax php登录表单不指向另一个页面
  10. jQuery autocomplete:如何在结果中选择某