Android仮想キータッチ呼び出しプロセス

2833 ワード

PhoneWindowManager.java
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn) { 

        if (down && (policyFlags & WindowManagerPolicy.FLAG_VIRTUAL) != 0 
                && event.getRepeatCount() == 0) { 
            performHapticFeedbackLw(null, HapticFeedbackConstants.VIRTUAL_KEY, false);
        }    

    public boolean performHapticFeedbackLw(WindowState win, int effectId, boolean always) {
        Log.e("++++++++++++++++++++++", "++++++++++performHapticFeedbackLw PhoneWindowManager.java");
        final boolean hapticsDisabled = Settings.System.getInt(mContext.getContentResolver(),
                Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) == 0;
        if (!always && (hapticsDisabled || mKeyguardMediator.isShowingAndNotHidden())) {
            return false;
        }
        long[] pattern = null;
        switch (effectId) {
            case HapticFeedbackConstants.LONG_PRESS:
                pattern = mLongPressVibePattern;
                break;
            case HapticFeedbackConstants.VIRTUAL_KEY:
                pattern = mVirtualKeyVibePattern;
                break;
            case HapticFeedbackConstants.KEYBOARD_TAP:
                pattern = mKeyboardTapVibePattern;
                break;
            case HapticFeedbackConstants.SAFE_MODE_DISABLED:
                pattern = mSafeModeDisabledVibePattern;
                break;
            case HapticFeedbackConstants.SAFE_MODE_ENABLED:
                pattern = mSafeModeEnabledVibePattern;
                break;
            default:
                return false;
        }
        if (pattern.length == 1) {
            // One-shot vibration
            mVibrator.vibrate(pattern[0]);
        } else {
            // Pattern vibration
            mVibrator.vibrate(pattern, -1);
        }
        return true;
    }

振動を使うところは他にもありますが、独自のperformHapticFeedback関数を持っています.例:
View.JAva(これはデスクトップ、アイコンを長く押すと振動します)
    public boolean performHapticFeedback(int feedbackConstant, int flags) {
        if (mAttachInfo == null) {
            return false;
        }     
        //noinspection SimplifiableIfStatement
        if ((flags & HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING) == 0
                && !isHapticFeedbackEnabled()) {
            return false;
        }     
        return mAttachInfo.mRootCallbacks.performHapticFeedback(feedbackConstant,
                (flags & HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING) != 0);
    }

Android4.0上の仮想キーも、彼が呼び出した振動によって呼び出されます.KeyButtonViewを見ることができます.JAva、彼は引き継いだViewです.
これはセッションを通っているようです.JAvaはPhoneWindowManagerを呼び出したJAvaのperformHapticFeedbackLw()です.