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,这样我们后面一层的批注画笔才能监听到触摸事件并绘画。然后我们可以设置所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); }
监听程序是否在前台显示(通过ActivityManager.getRunningAppProcesses()),如果没有,则马上把程序的task移动至前台(通过ActivityManager.moveTaskToFront())。但是Android早就已经想到这个漏洞,当你点击完home键后,系统的Launcher会有5秒的延迟保护。所有启动Activity、或者移动到前台的方法都会有5秒延迟。具体看stackoverflow上的解答,若需要破解此限制需要加入系统权限"android.permission.STOP_APP_SWITCHES":
也就是说,若没有系统权限的话,只能通过自己写第三方的Launcher即可破解,此方法经过撸主本人亲测有效!
原文地址:http://blog.csdn.net/codezjx/article/details/45485975