基于安卓10分析Input事件处理流程

本文深入剖析了Android系统的按键处理流程,从InputManagerService到NativeInputManager,再到InputDispatcher的工作原理,详细介绍了按键事件如何被捕捉、处理并传递给应用程序。
  • 前言

       安卓框架其实做的挺好,它已经把跟linux交互的过程都装起来,我们开发的时候基本不用再去关注这个实现。只要把对应的硬件设备对接好,比如触摸驱动替换等,基本不影响用户使用平台。这对平台移植,替换模块来说非常方便,对开发工程师来说也非常省事,只要关注应用开发就可以了。但是,搞清楚它的逻辑还是很必要的。

       这篇文章主要是记录个人对按键处理流程的一些理解。其实已经有很多小伙伴都有写过很多文章介绍过相关内容,但自己去看一遍源码更加能加深印象,也会有更多不一样的收获。

 

  • 整个交互流程

  • InputManagerService

       安卓的按键处理一定离不开InputManagerService,这是系统运行起来就开始的一个服务,没有它我们就不能操作APP。在SystemServer.java的startOtherServices中完成初始化:

            traceBeginAndSlog("StartInputManagerService");
            inputManager = new InputManagerService(context);
            traceEnd();

 SystemServer怎么工作,不在本文介绍范围内,这个涉及framework的启动,如果需要在framework中添加一个新的service,初始化的地方可以参考InputManagerService的启动添加。

   public InputManagerService(Context context) {
        this.mContext = context;
        this.mHandler = new InputManagerHandler(DisplayThread.get().getLooper());

        mUseDevInputEventForAudioJack =
                context.getResources().getBoolean(R.bool.config_useDevInputEventForAudioJack);
        Slog.i(TAG, "Initializing input manager, mUseDevInputEventForAudioJack="
                + mUseDevInputEventForAudioJack);
        mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue());
      
        String doubleTouchGestureEnablePath = context.getResources().getString(
                R.string.config_doubleTouchGestureEnableFile);
        mDoubleTouchGestureEnableFile = TextUtils.isEmpty(doubleTouchGestureEnablePath) ? null :
            new File(doubleTouchGestureEnablePath);

        LocalServices.addService(InputManagerInternal.class, new LocalService());
    }

 nativeInit是在com_android_server_input_InputManager

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值