在Android中一般按Home键是回到主界面,有时候客户需要特殊需求,这时候需要进行额外处理。想要完全监听Home键需要结合源码修改。
需要修改的源码及其路径:frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
1、通过源码我们可以发现,通过下面几个常量来控制,这些常量与config.xml文件相对应:
// 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、之后是通过readConfigurationDependentBehaviors()方法读取xml中定义的常量。我们也是在这修改所获取的值来达到修改长按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; //其实只加了这句话,强制赋值达到目的
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);
}
对应的XML文件的路径及其相应代码:\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 代表打开所有APP
2 - Launch assist intent 代表打开Google语音功能
This needs to match the constants in
policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
-->
<integer name="config_longPressOnHomeBehavior">0</integer>
PS:
有人可能会有疑问,为什么不能通过直接修改xml中的属性来达到目的,这是因为直接修改xml文件,系统会自动默认还原回去,这样设置无效。
包括power键等都可以通过修改该java文件来达到目的,双击也一样