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設置爲上面兩個之一就可以了!
監聽程序是否在前臺顯示(通過ActivityManager.getRunningAppProcesses()),如果沒有,則馬上把程序的task移動至前臺(通過ActivityManager.moveTaskToFront())。但是Android早就已經想到這個漏洞,當你點擊完home鍵後,系統的Launcher會有5秒的延遲保護。所有啓動Activity、或者移動到前臺的方法都會有5秒延遲。具體看stackoverflow上的解答,若需要破解此限制需要加入系統權限"android.permission.STOP_APP_SWITCHES":
也就是說,若沒有系統權限的話,只能通過自己寫第三方的Launcher即可破解,此方法經過擼主本人親測有效!