Android默认处理长按Home键会唤起最近使用应用列表,而部分厂商在安装了GMS后,Google会要求修改长按Home键唤起Google Now

修改frameworks/base/core/res/res/values/Config.xml

         0

注:这里的值可以设置三个,1代表唤起recent app界面;2代表唤起搜索界面(Google Now);3代表Nothing

我们在看处理方法:

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java

    @VisibleForTesting    boolean onHomeLongClick(View v) {        if (shouldDisableNavbarGestures()) {            return false;        }        MetricsLogger.action(getContext(), MetricsEvent.ACTION_ASSIST_LONG_PRESS);        mAssistManager.startAssist(new Bundle() /* args */);        mStatusBar.awakenDreams();        if (mNavigationBarView != null) {            mNavigationBarView.abortCurrentGesture();        }        return true;    }

实际上是在下面的方法中进行处理的

frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

 // 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;    //通过下面的方法读取config.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;        }        mShortPressWindowBehavior = SHORT_PRESS_WINDOW_NOTHING;        if (mContext.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) {            mShortPressWindowBehavior = SHORT_PRESS_WINDOW_PICTURE_IN_PICTURE;        }        mNavBarOpacityMode = res.getInteger(                com.android.internal.R.integer.config_navBarOpacityMode);    }   //长按的处理办法    private void handleLongPressOnHome(int deviceId) {        if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_NOTHING) {            return;        }        mHomeConsumed = true;        performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);        switch (mLongPressOnHomeBehavior) {            case LONG_PRESS_HOME_ALL_APPS:                launchAllAppsAction();                break;            case LONG_PRESS_HOME_ASSIST:                launchAssistAction(null, deviceId);                break;            default:                Log.w(TAG, "Undefined home long press behavior: " + mLongPressOnHomeBehavior);                break;        }    }    private void launchAllAppsAction() {        Intent intent = new Intent(Intent.ACTION_ALL_APPS);        if (mHasFeatureLeanback) {            final PackageManager pm = mContext.getPackageManager();            Intent intentLauncher = new Intent(Intent.ACTION_MAIN);            intentLauncher.addCategory(Intent.CATEGORY_HOME);            ResolveInfo resolveInfo = pm.resolveActivityAsUser(intentLauncher,                    PackageManager.MATCH_SYSTEM_ONLY,                    mCurrentUserId);            if (resolveInfo != null) {                intent.setPackage(resolveInfo.activityInfo.packageName);            }        }        startActivityAsUser(intent, UserHandle.CURRENT);    }

最后在插播一句,处理home按键的最初方法是

 @Override    public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {}

 

更多相关文章

  1. [置顶] Android中AIDL实现进程通信(附源码下载)
  2. 如何将打开res raw目录中的数据库文件?
  3. 安卓MonkeyRunner源码分析之与Android设备通讯方式
  4. Android(安卓)App开发基础篇—实现非阻塞Socket通信
  5. Android(安卓)Bluetooth HID实现详解
  6. Android面试笔试集锦
  7. Android(安卓)Activity 各函数解析
  8. Android中解析读取复杂word,excel,ppt等的方法
  9. android平台上的sqllite_简介

随机推荐

  1. ListActivity的使用
  2. Git操作常用概念和命令
  3. Android(安卓)关于判断应用是否有网络
  4. Android 动画学习
  5. android多层树形结构列表学习笔记
  6. 【转】Android 9 Pie 兼容性常见问题及注
  7. android NDK的单步调试
  8. 使用Android Studio对Android系统源码进
  9. Android 编译(二)
  10. Android(安卓)GPS学习笔记—JNI层实现