屏蔽返回键
比较简单,重写onBackPressed()
即可,不调用超类方法
1 |
|
屏蔽Home键
常规方法
代码如下,但是在Android4.0以上会失效
1 |
|
并加入权限:
1 | <uses-permission android:name=”android.permission.DISABLE_KEYGUARD”></uses-permission> |
Android4.0以上的屏蔽方法
此法较为猥琐,但在Android4.4以上会失效
用WindowManager
的addview
方法将view加到窗口上,加上的时候将view的layoutparamas
的type设为LayoutParams.TYPE_SYSTEM_ERROR
。
并加上权限
1 | <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键的效果。
参考代码:
1 | private void forbiddenHomeKey(){ |
为什么设置了这个type后就可以屏蔽Home呢?我们可以看看PhoneWindowManager.java
的interceptKeyBeforeDispatching()
方法:
1 | final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length; |
WINDOW_TYPES_WHERE_HOME_DOESNT_WORK
常量的值为:
1 | private static final int[] WINDOW_TYPES_WHERE_HOME_DOESNT_WORK = { |
所以type设置为上面两个之一就可以了!
关于Home的屏蔽,还有一种思路
监听程序是否在前台显示(通过ActivityManager.getRunningAppProcesses()
),如果没有,则马上把程序的task移动至前台(通过ActivityManager.moveTaskToFront()
)。但是Android早就已经想到这个漏洞,当你点击完home键后,系统的Launcher会有5秒的延迟保护。所有启动Activity、或者移动到前台的方法都会有5秒延迟。具体看stackoverflow上的解答,若需要破解此限制需要加入系统权限android.permission.STOP_APP_SWITCHES
:
也就是说,若没有系统权限的话,只能通过自己写第三方的Launcher即可破解,此方法经过撸主本人亲测有效!