我是靠谱客的博主 知性钢笔,最近开发中收集的这篇文章主要介绍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层的最末

最后

以上就是知性钢笔为你收集整理的linux屏幕触碰事件,从你触摸屏幕开始分析android触摸事件分发的全部内容,希望文章能够帮你解决linux屏幕触碰事件,从你触摸屏幕开始分析android触摸事件分发所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部