代碼所在位置:
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;
}