天天看點

【Android系統源碼修改】捕捉按鍵,并實作長按短按 -- 示例

代碼所在位置:

frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

捕捉按鍵,并實作長按短按

對按鍵 KeyEvent.KEYCODE_AT 進行捕捉和實作長按、短按

event.getRepeatCount() 讀取按鍵重複次數

event.startTracking() 如果要追蹤長按事件,必須調用 event.startTracking()

interceptKeyBeforeDispatching 函數,攔截按鈕按下事件,判斷是否交給應用層處理,如果傳回-1,消耗按鍵事件;如果傳回0,交給應用處理

static boolean mIsATLongPressed = false;
    static boolean mIsATLongPressedFirst = true;
    /** {@inheritDoc} */
    @Override
    public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
       // .... n行代碼     
       final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
          
       // .... n行代碼
      
        if (keyCode == KeyEvent.KEYCODE_AT) {
            if (down) {
                if (event.getRepeatCount() == 0) {
                    event.startTracking();
                    mIsATLongPressed = false;
                } else {
                    mIsATLongPressed = true;
                    if (mIsATLongPressedFirst && mIsATLongPressed) {
                        // 處理長按
                        mContext.sendBroadcast(    
                                   new Intent("com.xxx.ACTION_HDMI_LONG_PRESSED"));
                        mIsATLongPressedFirst = false;
                    }
                }
            } else {
                if (!mIsATLongPressed) {
                    // 處理短按
                    mContext.sendBroadcast(
                                   new Intent("com.xxx.ACTION_HDMI_SHORT_PRESSED"));
                }
                mIsATLongPressedFirst = true;
            }
            return -1;
        }