第六章:输入系统(5)-Reader_Dispatcher线程启动分析

在前面的的小节提到过,输入子系统框架中,在应用层会创建Reader与Dispatcher两个线程,这两个线程都是while循环,该小节我们就查看源码他们是如何创建如何工作的。

基于面向对象思想,源码中定义了两个类,InputRread(实例化为mRead)与InputDispatcher(mDispatcher),两个类类中实现了一些方法并且在这两个类中分别包含了类成员
InputRreadTHread(实例化mRreadTHread),InputDispatcherTHread(mDispatcherTHread),

InputRreadTHread与InputDispatcherTHread,然后分别实例化了两个对象mRreadTHread与mDispatcherTHread,现在我们来查看InputRreadTHread,在源码中打开文件frameworks/native/services/inputflinger/InputReader.cpp文件,可以看到如下代码:

	bool InputReaderThread::threadLoop() {
	    mReader->loopOnce();
	    return true;
	}

该函数就是InputRreadTHread(实例化mRreadTHread)线程的循环主体,并且在
InputRread中还存在类成员EnventHub meventHub,InputRread是可以接收很多个设备的,如鼠标,触摸屏键盘等等,以后我们会使用meventHub这个成员去监测多个设备。这些东西都太复杂了,所以还实现了一个InputMenager去进行了封装,在编写java的时候,也不想了解那么复杂的过程,所以再次通过NativeInputManager(实例化为im)进行封装,所有的源头都从java开始的,即SystemServer.java开始。

打开SystemServer.java文件,可以找到

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

我们查看 InputManagerService的构造函数可以找到

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

看到nativeInit我们就知道,他是去调用C++实现的一个函数,这个C++函数就在com_android_server_input_InputManagerService.cpp中,怎么找到该文件呢?我们搜索nativeInit,找到相似的即可,我们进入该文件,在该文件的nativeInit()函数中:

 	NativeInputManager* im = new NativeInputManager(contextObj, serviceObj,

继续查看 NativeInputManager的构造函数,可以看到:

	sp<EventHub> eventHub = new EventHub();
	mInputManager = new InputManager(eventHub, this, this);

对以源码追踪总结如下:
在这里插入图片描述
细致的调用过程如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南才尽,年少无知!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值