这与你的工作无关。
溢出菜单由 PopupWindow 实现。当用户触摸关闭 PopupWindow 时,ACTION_DOWN 事件排队到应用程序的消息队列中。然后通过 ViewPostImeInputStage 类传递给 View,最后 ViewPostImeInputStage 将此输入事件发送到 PopupWindow 的 onTouchEvent 监听器。
@Override
public boolean onTouchEvent(MotionEvent event) {
final int x = (int) event.getX();
final int y = (int) event.getY();
if ((event.getAction() == MotionEvent.ACTION_DOWN)
&& ((x < 0) || (x >= getWidth()) || (y < 0) || (y >= getHeight()))) {
dismiss();
return true;
} else if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
dismiss();
return true;
} else {
return super.onTouchEvent(event);
}
}
dissmiss() 尝试先关闭 PopupWindow 和 PopupWindow::onDetachedWindow 调用 WindowInputEventReceiver::dispose() 。
然后 ViewPostImeInputStage 调用 WindowInputEventReceiver::finishInputEvent 来完成那个 ACTION_DOWN 事件。但是 WindowInputEventReceiver 实例已被释放,因此它会引发警告消息。
可以断点调试。打开InputEventReceiver.java(需要android源码在framework/base/)并在dispose方法处设置断点。