在Android中一般按Home鍵是回到主界面,有時(shí)候客戶需要特殊需求兰怠,這時(shí)候需要進(jìn)行額外處理涩搓。想要完全監(jiān)聽(tīng)Home鍵需要結(jié)合源碼修改姿锭。
需要修改的源碼及其路徑:frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
1、通過(guò)源碼我們可以發(fā)現(xiàn)凹嘲,通過(guò)下面幾個(gè)常量來(lái)控制,這些常量與config.xml文件相對(duì)應(yīng):
// These need to match the documentation/constant in
// core/res/res/values/config.xml
static final int LONG_PRESS_HOME_NOTHING = 0;
static final int LONG_PRESS_HOME_ALL_APPS = 1;
static final int LONG_PRESS_HOME_ASSIST = 2;
static final int LAST_LONG_PRESS_HOME_BEHAVIOR = LONG_PRESS_HOME_ASSIST;
2、之后是通過(guò)readConfigurationDependentBehaviors()方法讀取xml中定義的常量洞斯。我們也是在這修改所獲取的值來(lái)達(dá)到修改長(zhǎng)按Home鍵的目的。以下是代碼:
/**
* Read values from config.xml that may be overridden depending on
* the configuration of the device.
* eg. Disable long press on home goes to recents on sw600dp.
*/
private void readConfigurationDependentBehaviors() {
final Resources res = mContext.getResources();
mLongPressOnHomeBehavior = res.getInteger(
com.android.internal.R.integer.config_longPressOnHomeBehavior);
if (mLongPressOnHomeBehavior < LONG_PRESS_HOME_NOTHING ||
mLongPressOnHomeBehavior > LAST_LONG_PRESS_HOME_BEHAVIOR) {
mLongPressOnHomeBehavior = LONG_PRESS_HOME_NOTHING;
}
mDoubleTapOnHomeBehavior = res.getInteger(
com.android.internal.R.integer.config_doubleTapOnHomeBehavior);
if (mDoubleTapOnHomeBehavior < DOUBLE_TAP_HOME_NOTHING ||
mDoubleTapOnHomeBehavior > DOUBLE_TAP_HOME_RECENT_SYSTEM_UI) {
mDoubleTapOnHomeBehavior = LONG_PRESS_HOME_NOTHING;
}
mShortPressOnWindowBehavior = SHORT_PRESS_WINDOW_NOTHING;
if (mContext.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) {
mShortPressOnWindowBehavior = SHORT_PRESS_WINDOW_PICTURE_IN_PICTURE;
}
mNavBarOpacityMode = res.getInteger(
com.android.internal.R.integer.config_navBarOpacityMode);
}
3坑赡、修改后的方法:
private void readConfigurationDependentBehaviors() {
final Resources res = mContext.getResources();
mLongPressOnHomeBehavior = res.getInteger(
com.android.internal.R.integer.config_longPressOnHomeBehavior);
if (mLongPressOnHomeBehavior < LONG_PRESS_HOME_NOTHING ||
mLongPressOnHomeBehavior > LAST_LONG_PRESS_HOME_BEHAVIOR) {
mLongPressOnHomeBehavior = LONG_PRESS_HOME_NOTHING;
}
mLongPressOnHomeBehavior= LONG_PRESS_HOME_NOTHING; //其實(shí)只加了這句話巡扇,強(qiáng)制賦值達(dá)到目的
Log.w(TAG,"LongPress : "+mLongPressOnHomeBehavior);
mDoubleTapOnHomeBehavior = res.getInteger(
com.android.internal.R.integer.config_doubleTapOnHomeBehavior);
if (mDoubleTapOnHomeBehavior < DOUBLE_TAP_HOME_NOTHING ||
mDoubleTapOnHomeBehavior > DOUBLE_TAP_HOME_RECENT_SYSTEM_UI) {
mDoubleTapOnHomeBehavior = LONG_PRESS_HOME_NOTHING;
}
mShortPressOnWindowBehavior = SHORT_PRESS_WINDOW_NOTHING;
if (mContext.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) {
mShortPressOnWindowBehavior = SHORT_PRESS_WINDOW_PICTURE_IN_PICTURE;
}
mNavBarOpacityMode = res.getInteger(
com.android.internal.R.integer.config_navBarOpacityMode);
}
對(duì)應(yīng)的XML文件的路徑及其相應(yīng)代碼:\frameworks\base\core\res\res\values\config.xml
<!-- Control the behavior when the user long presses the home button.
0 - Nothing 代表什么操作都不做
1 - Launch all apps intent 代表打開(kāi)所有APP
2 - Launch assist intent 代表打開(kāi)Google語(yǔ)音功能
This needs to match the constants in
policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
-->
<integer name="config_longPressOnHomeBehavior">0</integer>
PS:
有人可能會(huì)有疑問(wèn),為什么不能通過(guò)直接修改xml中的屬性來(lái)達(dá)到目的垮衷,這是因?yàn)橹苯有薷膞ml文件厅翔,系統(tǒng)會(huì)自動(dòng)默認(rèn)還原回去,這樣設(shè)置無(wú)效搀突。
包括power鍵等都可以通過(guò)修改該java文件來(lái)達(dá)到目的刀闷,雙擊也一樣