AndroidKeyEvent分发过程

AndroidKeyEvent分发过程

2023年7月13日发(作者:)

AndroidKeyEvent分发过程⼀、背景Activity和View有三个override的⽅法dispatchKeyEvent、onKeyUp、onKeyDown,其中View还有⼀个setOnKeyListener⽅法。只知道这⼏个⽅法是设置处理key event的,但是⼀直不太理解这⼏个⽅法的作⽤和相互影响。所以准备写个demo彻底搞清楚这⼏个⽅法的作⽤和原理。⼆、测试准备新建三个类public class KeyDispatchDemo extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { te(savedInstanceState); setContentView(ty_key_dispatch); } @Override public boolean dispatchKeyEvent(KeyEvent event) { Log.d("Activity", "dispatchKeyEvent: " + ion() + " | " + Code()); return chKeyEvent(event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { Log.d("Activity", "onKeyUp: " + keyCode); return p(keyCode, event); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { Log.d("Activity", "onKeyDown: " + keyCode); return own(keyCode, event); }}public class KeyDispatchLinearLayout extends LinearLayout { public KeyDispatchLinearLayout(Context context) { super(context); } public KeyDispatchLinearLayout(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public KeyDispatchLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public boolean dispatchKeyEvent(KeyEvent event) { Log.d("ViewGroup", "dispatchKeyEvent: " + ion() + " | " + Code()); return chKeyEvent(event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { Log.d("ViewGroup", "onKeyUp: " + keyCode); return p(keyCode, event); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { Log.d("ViewGroup", "onKeyDown: " + keyCode); return own(keyCode, event); }}public class KeyDispatchView extends View { public KeyDispatchView(Context context) { super(context); } public KeyDispatchView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public KeyDispatchView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public boolean dispatchKeyEvent(KeyEvent event) { Log.d("View", "dispatchKeyEvent: " + ion() + " | " + Code()); return chKeyEvent(event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { Log.d("View", "onKeyUp: " + keyCode); return p(keyCode, event); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { Log.d("View", "onKeyDown: " + keyCode); return own(keyCode, event); }}布局⽂件: 三、Key event分发流程分析⾸先在关键⽅法上都打上断点,按下键盘,发出⼀个key event事件。1、dispatchKeyEvent的执⾏流程dispatchKeyEvent的分发主要是:DecorView——>Activity——>ViewGroup——>View⼀个Key event是⾸先传到DecorView中,DecorView通过下⾯的代码分发给Activity: if (!royed()) { final ck cb = lback(); final boolean handled = cb != null && mFeatureId < 0 ? chKeyEvent(event) : chKeyEvent(event); if (handled) { return true; } }其中lback()就是⽬标Activity在Activity的dispatchKeyEvent⽅法⾥⾯,传递给了PhoneWindow的superDispatchKeyEvent⽅法PhoneWindow的superDispatchKeyEvent⽅法会调到ViewGroup的dispatchKeyEvent⽅法:ViewGroup会⼀层⼀层的把key event传递给持有焦点的child:总结:在这个dispatchKeyEvent链中,只要有⼀个返回true,就是没调chKeyEvent⽅法,那么key event的传递就会终⽌。2、onKeyDown的执⾏流程own的执⾏:和dispatch的流程⼀致,key event从DecorView分发到View的dispatchKeyEvent在chKeyEvent分发到ch:最后分发到own如果own没有返回true,那么key event会继续流传给Activity:最后会传给own总结:own如果返回true,表⽰View消耗了这个事件,那么这个事件不会再流转到Activity3、onKeyUp的执⾏流程onKeyUp的流程和onKeyDown类似,不再累述。总结:p如果返回true,表⽰View消耗了这个事件,那么这个事件不会再流转到Activity。并且onKeyUp的流转和onKeyDown是独⽴的,不会相互影响。

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689216392a222328.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信