linux屏幕触碰事件,从你触摸屏幕开始分析android触摸事件分发

WMS

而这里的复杂步骤涉及到frameWork层,我们就从WMS开始吧,

先是有SystemServer启动的WMS。SystemServer.java的startOtherServices()

wm = WindowManagerService.main(context, inputManager,

mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,

!mFirstBoot, mOnlyCore);

并且同样在这个方法中初始化了InputManagerService,掌管输入事件的服务。

inputManager = new InputManagerService(context);

我们看到WindowManagerService的main方法传入的就是这个inputManager。

在InputManagerService的构造方法中,用到了

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

native的方法,nativce层不是重点,我这边就快速的将过去了。

在frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp中(没有在本地编译过源码的同学可以去 http://androidxref.com/ 查看,基于当前最新的7.1.1)

static jlong nativeInit(JNIEnv* env, jclass /* clazz */,

jobject serviceObj, jobject contextObj, jobject messageQueueObj) {

sp messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj);

if (messageQueue == NULL) {

jniThrowRuntimeException(env, "MessageQueue is not initialized.");

return 0;

}

NativeInputManager* im = new NativeInputManager(contextObj, serviceObj,

messageQueue->getLooper());

im->incStrong(0);

eturn reinterpret_cast(im);

}

然后看内部类nativeInputManger

NativeInputManager::NativeInputManager(jobject contextObj,

...

sp eventHub = new EventHub();

mInputManager = new InputManager(eventHub, this, this);

}

我们看到创建了一个EventHub类,并且将其交给InputManger并生成一个InputManger对象。

/frameworks/native/services/inputflinger/InputManager.cpp

InputManager::InputManager(

const sp& eventHub,

const sp& readerPolicy,

const sp& dispatcherPolicy) {

mDispatcher = new InputDispatcher(dispatcherPolicy);

mReader = new InputReader(eventHub, readerPolicy, mDispatcher);

initialize();

}

一个分发对象,一个reader对象,并且调用initialize方法

void InputManager::initialize() {

mReaderThread = new InputReaderThread(mReader);

mDispatcherThread = new InputDispatcherThread(mDispatcher);

}

创建读线程和分发线程

至此,所有的初始化先都ok了,在SystemServer.java,创建了InputManagerService之后没几行就调用了 inputManager.start();,

public void start() {

...

nativeStart(mPtr);

...

}

又看到了native。。。来吧继续相当枯燥的native,我要快进了,我有点写的想吐。。

frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp

static void nativeStart(JNIEnv* env, jclass /* clazz */, jlong ptr) {

NativeInputManager* im = reinterpret_cast(ptr);

status_t result = im->getInputManager()->start();

if (result) {

jniThrowRuntimeException(env, "Input manager could not be started.");

}

}

/frameworks/native/services/inputflinger/InputManager.cpp

status_t InputManager::start() {

status_t result = mDispatcherThread->run("InputDispatcher", PRIORITY_URGENT_DISPLAY);

if (result) {

ALOGE("Could not start InputDispatcher thread due to error %d.", result);

return result;

}

result = mReaderThread->run("InputReader", PRIORITY_URGENT_DISPLAY);

if (result) {

ALOGE("Could not start InputReader thread due to error %d.", result);

mDispatcherThread->requestExit();

return result;

}

return OK;

}

启动了读线程和分发线程

/frameworks/native/services/inputflinger/InputReader.cpp

bool InputReaderThread::threadLoop() {

mReader->loopOnce();

return true;

}

void InputReader::loopOnce() {

...

size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);

...

}

不断的loop去通过EventHub去getEvents(越来越偏了,getEvents不继续往下了,知道这个深度已经对于非framework工程师来说已经够了)

在getEvents方法中去从dev/input/目录下读取设备节点并加工,并返回给InputReader进行处理。

之后的处理过程以及一系列跳转也是相当复杂,由于本文的初衷并非详解最底层的东西,

故而此处一并略过直接到底层将event回传给java层的最末

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值