本文基于Android 7.0
在Android系统中,back键事件是有app自己处理的,而home是系统全局处理事件,因为在任何app界面,按下home结果都是一样的回到launcher。
先看下back事件
back键处理
Android事件处理过程大致为
- Native层 –> ViewRootImpl层 –> DecorView层 –> Activity层 –> ViewGroup层 –> View层
frameworks/base/core/java/android/view/ViewRootImpl.java
private int processKeyEvent(QueuedInputEvent q) {
final KeyEvent event = (KeyEvent)q.mEvent;
// Deliver the key to the view hierarchy.
if (mView.dispatchKeyEvent(event)) {
return FINISH_HANDLED;
}
...
return FORWARD;
}
这里的mView是DecorView,直接调用DecorView的dispatchKeyEvent分发事件
frameworks/base/core/java/com/android/internal/policy/DecorView.java
public boolean dispatchKeyEvent(KeyEvent event) {
...
if (!mWindow.isDestroyed()) {
final Window.Callback cb = mWindow.getCallback();
final boolean handled = cb != null && mFeatureId < 0 ? cb.dispatchKeyEvent(event)
: super.dispatchKeyEvent(event);
if (handled) {
return true;
}
}
...
}
分发back事件时mWindow还玩destr