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即可破解,此方法經過擼主本人親測有效!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章