Back键和Home键的屏蔽

FBI Warning:欢迎转载,但请标明出处:http://blog.csdn.net/codezjx/article/details/45485975,未经本人同意请勿用于商业用途,感谢支持!

(1)屏蔽返回键:  重写onBackPressed()即可,不调用超类方法

@Override
public void onBackPressed() {
	// super.onBackPressed();
}


(2)屏蔽Home键:

1、常规方法如下:(但是在Android4.0以上会失效

@Override
public void onAttachedToWindow(){
	this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
	super.onAttachedToWindow();
}

并加入权限:

<uses-permission android:name=”android.permission.DISABLE_KEYGUARD”></uses-permission>


2、Android4.0以上的屏蔽方法:(较为猥琐,但在Android4.4以上会失效

用WindowManager的addview方法将view加到窗口上,加上的时候将view的layoutparamas的type设为LayoutParams.TYPE_SYSTEM_ERROR。

并加上权限<uses-permission android:name=”android.permission.SYSTEM_ALERT_WINDOW”/>

原理:使用WindowManager在屏幕最前面加上一层view,并让其type设置为:LayoutParams.TYPE_SYSTEM_ERROR,官方对其解释是: internal system error windows, appear on top of everything they can,既显示在任何界面之上。并且设置flags 为LayoutParams.FLAG_NOT_TOUCHABLE,这样我们后面一层的View才能监听到触摸事件。然后我们可以设置所add的view是一个空view,就不会感觉前面多了一层东西,从而达到屏蔽Home键的效果。

参考代码:

private void forbiddenHomeKey(){
	mWindowManager = this.getWindowManager();
	mWindowManagerParams = new LayoutParams();
	mWindowManagerParams.width = LayoutParams.WRAP_CONTENT;
	mWindowManagerParams.height = LayoutParams.WRAP_CONTENT;
 	// internal system error windows, appear on top of everything they can
	mWindowManagerParams.type = LayoutParams.TYPE_SYSTEM_ERROR;
	 // indicate this view don’t respond the touch event
	mWindowManagerParams.flags = LayoutParams.FLAG_NOT_TOUCHABLE;
	// add an empty view on the top of the window
	mEmptyView = new View(this);
	mWindowManager.addView(mEmptyView, mWindowManagerParams);
}


为什么设置了这个type后就可以屏蔽Home呢?我们可以看看PhoneWindowManager.java的interceptKeyBeforeDispatching()方法:

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;
	}
}
WINDOW_TYPES_WHERE_HOME_DOESNT_WORK常量的值为:

private static final int[] WINDOW_TYPES_WHERE_HOME_DOESNT_WORK = {
    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
    WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
};

所以type设置为上面两个之一就可以了!



3、关于Home的屏蔽,还有一种思路:

监听程序是否在前台显示(通过ActivityManager.getRunningAppProcesses()),如果没有,则马上把程序的task移动至前台(通过ActivityManager.moveTaskToFront())。但是Android早就已经想到这个漏洞,当你点击完home键后,系统的Launcher会有5秒的延迟保护。所有启动Activity、或者移动到前台的方法都会有5秒延迟。具体看stackoverflow上的解答,若需要破解此限制需要加入系统权限"android.permission.STOP_APP_SWITCHES"

http://stackoverflow.com/questions/5600084/starting-an-activity-from-a-service-after-home-button-pressed-without-the-5-seco

也就是说,若没有系统权限的话,只能通过自己写第三方的Launcher即可破解,此方法经过撸主本人亲测有效!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值