Input初始化

Inpuit机制

当用户对手机进行操作时,对应的数据流将是下面一个概括的流程

  • HW 如传感器,触摸屏(TP),物理按键(KP)等感知到用户操作后,触发相关的中断(ISR)传递给Kernel,Kernel相关的driver 对这些中断进行处理后,转化成标准的InputEvent。
  • UserSpace 的System Server中的Input System则持续监听Kernel传递上来的原始InputEvent,对其进行进一步的处理后,变成上层APP可直接处理的Input Event,如button点击,长按,滑动等等。
  • APP 对相关的事件进行处理后,请求更新相关的逻辑界面,而这个则由System Server中的WMS 等来负责。
  • 相关的逻辑界面更新后,则会请求SurfaceFlinger来产生FrameBuffer数据,SurfaceFlinger则会利用GPU 等来计算生成。
  • DisplaySystem/Driver 则会将FrameBuffer中的数据更新显示出来,这样用户才能感知到他的操作行为。

所以Android的交互是基于用户输入的一个反馈动作,下面我们来介绍Android的一个重要的子系统–Input子系统。
首先我们了解一下这个系统的初始化过程,在SystemServer初始化过程中,IMS和WMS被创建出来,其中IMS作为参数加入WMS的初始化中,其中还包括一个PhoneWIndowManager对象,当然WMS的monitor回调也传入IMS中

    private void startOtherServices() {
            inputManager = new InputManagerService(context);
          
            wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,
                    new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);
 inputManager.setWindowManagerCallbacks(wm.getInputManagerCallback());
            inputManager.start();
    }

看IMS的start方法,调用nativeStart方法,传入一个nativeInt生成的mPtr指针对象
IMS的构造方法中执行了nativeInit,这是个native方法,属于jni调用,该方法中创建了一个NativeInputManager实例,并且和java层使用的是同一个looper。

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

        mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue());

    }
static jlong nativeInit(JNIEnv* env, jclass /* clazz */,
        jobject serviceObj, jobject contextObj, jobject messageQueueObj) {

    NativeInputManager* im = new NativeInputManager(contextObj, serviceObj,
            messageQueue->getLooper());
}


NativeInputManager::NativeInputManager(jobject contextObj,
        jobject serviceObj, const sp<Looper>& looper) :
        mLooper(looper), mInteractive(true) {
    mInputManager = new InputManager(this, this);
}

在NativeInputManager的初始化中创建了一个InputManager

InputManager::InputManager(
        const sp<InputReaderPolicyInterface>& readerPolicy,
        const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) {
    mDispatcher = createInputDispatcher(dispatcherPolicy);
    mClassifier = new InputClassifier(mDispatcher);
    mReader = createInputReader(readerPolicy, mClassifier);
}

status_t InputManager::start() {
    status_t result = mDispatcher->start();
    result = mReader->start();
}

在这里插入图片描述

InputManager初始化时创建了两个重要操作类:InputReader和InputDispatcher。
InputManager的start方法,让两个线程run起来。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值