Android 5.0 屏蔽Home键
来源:互联网 发布:山东数据共享交换平台 编辑:程序博客网 时间:2024/05/02 17:56
最近项目有这样的需要所以研究了一下着块的内容.....刚开始在度娘了一大堆 要么支持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<typeCount; 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这个类型给开放出来了..只需要加个标记去判断要不要返回到主界面就可以了,这样子改
1:首先加个是否回到桌面的标记
2:加个类型判断当时这个类型时我们让标记为false
3:在要返回桌面的方法进行判断
到此位置我们源码的改动就完成了,最后上层要用的话只需要在要屏蔽Home键的当前Activity中复写onAttachedToWindow跟onKeyDown
并可以再onKeyDowm中干我们想干的事,什么都不干return true就可以了
@Override
public void onAttachedToWindow() {
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
super.onAttachedToWindow();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_HOME){
//干自己的事情
return true;
}
else {
return super.onKeyDown(keyCode, event);
}
}
- Android 5.0 屏蔽Home键
- Android HOME键屏蔽
- Android 屏蔽HOME键
- Android屏蔽home键
- android屏蔽home键
- Android屏蔽home键
- Android 屏蔽Home键
- android 屏蔽home键
- android 屏蔽home键
- Android屏蔽HOME键
- android屏蔽Home键
- android 屏蔽HOME键
- android home键屏蔽
- Android 屏蔽Home键
- Android 屏蔽home键
- 屏蔽 Home 键 (Android|)
- Android 中屏蔽 Home 键
- Android 如何屏蔽Home键
- 数据结构绪论
- 小问题
- 在JSP里使用CKEditor和CKFinder
- Nginx 配置 location 总结及 rewrite 规则写法
- CGRect_获取控件的高,宽,x,y等简便方法
- Android 5.0 屏蔽Home键
- Oracle Job 任务计划管理[作业,定期执行任务]
- mysql 主键自动增长问题
- SwipeListView
- iOS应用性能调优
- NSLocalizedString
- ofbiz配置文件[widget.properties]解析
- 容联云通讯---将系统手机联系人注册用户,同步服务器至本地数据库
- oneEqEddy代码研究