Step 8. PhoneWindow.superDispatchKeyEvent
[java] view plaincopyprint?
public class PhoneWindow extends Window implements MenuBuilder.Callback {
......
// This is the top-level view of the window, containing the window decor.
private DecorView mDecor;
......
@Override
public boolean superDispatchKeyEvent(KeyEvent event) {
return mDecor.superDispatchKeyEvent(event);
}
......
}
public class PhoneWindow extends Window implements MenuBuilder.Callback {
......
// This is the top-level view of the window, containing the window decor.
private DecorView mDecor;
......
@Override
public boolean superDispatchKeyEvent(KeyEvent event) {
return mDecor.superDispatchKeyEvent(event);
}
......
}
這個函數定義在文件frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindow.java中。
PhoneWindow類的成員變量mDecor描述的是當前正在處理的Activity組件窗口的頂層視圖,PhoneWindow類的成員函數superDispatchKeyEvent通過調用它所指向的一個DecorView對象的成員函數superDispatchKeyEvent來處理參數event所描述的鍵盤事件。
Step 9. DecorView.superDispatchKeyEvent
[java] view plaincopyprint?
public class PhoneWindow extends Window implements MenuBuilder.Callback {
......
private final class DecorView extends FrameLayout implements RootViewSurfaceTaker {
......
public boolean superDispatchKeyEvent(KeyEvent event) {
return super.dispatchKeyEvent(event);
}
......
}
......
}
public class PhoneWindow extends Window implements MenuBuilder.Callback {
......
private final class DecorView extends FrameLayout implements RootViewSurfaceTaker {
......
public boolean superDispatchKeyEvent(KeyEvent event) {
return super.dispatchKeyEvent(event);
}
......
}
......
}
這個函數定義在文件frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindow.java中。
DecorView類的成員函數superDispatchKeyEvent的實現很簡單,它只是調用父類ViewGroup的成員函數dispatchKeyEvent來處理參數event所描述的鍵盤事件。
Step 10. ViewGroup.dispatchKeyEvent
[java] view plaincopyprint?
public abstract class ViewGroup extends View implements ViewParent, ViewManager {
......
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if ((mPrivateFlags & (FOCUSED | HAS_BOUNDS)) == (FOCUSED | HAS_BOUNDS)) {
return super.dispatchKeyEvent(event);
} else if (mFocused != null && (mFocused.mPrivateFlags & HAS_BOUNDS) == HAS_BOUNDS) {
return mFocused.dispatchKeyEvent(event);
}
return false;
}
......
}
public abstract class ViewGroup extends View implements ViewParent, ViewManager {
......
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if ((mPrivateFlags & (FOCUSED | HAS_BOUNDS)) == (FOCUSED | HAS_BOUNDS)) {
return super.dispatchKeyEvent(event);
} else if (mFocused != null && (mFocused.mPrivateFlags & HAS_BOUNDS) == HAS_BOUNDS) {
return mFocused.dispatchKeyEvent(event);
}
return false;
}
......
}
這個函數定義在文件frameworks/base/core/java/android/view/ViewGroup.java中。
ViewGroup類的成員函數dispatchKeyEvent的實現與在前面的Step 3中所介紹的ViewGroup類的成員函數dispatchKeyEventPreIme的實現是類似的,即如果當前正在處理的視圖容器能夠獲得焦點并且該視圖容器的大小已經計算好了,那么就會將參數event所描述的鍵盤事件分發給它的父類View的成員函數dispatchKeyEvent來處理,否則的話,如果當前正在處理的視圖容器有一個焦點子視圖,并且這個焦點子視圖的大小已經計算好了,那么就將參數event所描述的鍵盤事件分發給該焦點子視圖的父類View的成員函數dispatchKeyEvent來處理。
從前面的調用過程可以知道,當前正在處理的視圖容器即為Activity組件窗口的頂層視圖。我們假設在該頂層視圖中,獲得焦點的是一個TextView控件,并且這個TextView控件的大小已經計算好了,那么接下來就會調用這個TextView控件的父類View的成員函數dispatchKeyEvent來處理參數event所描述的鍵盤事件。
Step 11. View.dispatchKeyEvent
[java] view plaincopyprint?
public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {
......
private OnKeyListener mOnKeyListener;
原文轉自:http://blog.csdn.net/luoshengyang/article/details/8636153