由浅入深学习android input系统 - input系统的启动
Posted 许佳佳233
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了由浅入深学习android input系统 - input系统的启动相关的知识,希望对你有一定的参考价值。
android input系列文章
由浅入深学习android input系统(一) - input事件如何传递到View
由浅入深学习android input系统(二) - input事件如何传递到app进程( InputDispatcher )
由浅入深学习android input系统(三) - InputChannel解析
由浅入深学习android input系统(四) - input事件采集(InputReader)
由浅入深学习android input系统(五) - input系统的启动
概述
前文已经讲过了input系统对事件的抓取以及传递,此文将探索下input系统的启动。
input系统的初始化
调用的任务栈如下:
- SystemServer.main()
- SystemServer.run()
- InputManagerService构造函数
- InputManagerService.nativeInit()
- com_android_server_input_InputManagerService.nativeInit()
- NativeInputManager构造函数
- InputManager构造函数
InputManager构造函数中初始化了两部分:
- 初始化InputReader与InputDispatcher
- 初始化InputReaderThread与 InputDispatcherThread
InputManager::InputManager(
const sp<InputReaderInterface>& reader,
const sp<InputDispatcherInterface>& dispatcher) :
mReader(reader),
mDispatcher(dispatcher) {
initialize();
}
void InputManager::initialize() {
mReaderThread = new InputReaderThread(mReader);
mDispatcherThread = new InputDispatcherThread(mDispatcher);
}
input系统的启动
调用的任务栈如下:
- SystemServer.main()
- SystemServer.run()
- InputManagerService.start()
- InputManagerService.nativeStart()
- com_android_server_input_InputManagerService.nativeStart()
- InputManager.stat()
InputManager的start()方法中分别启动了InputReaderThread与InputDispatcherThread。
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;
}
InputReaderThread
要点如下:
- 运行了run()方法后,最终会执行到threadLoop()方法,这个方法只有在执行requestExit()后才会停止循环
- threadloop()中执行了InputReader.loopOnce()方法,开始接收硬件的事件。
对InputReader.loopOnce()的内容由兴趣的读者可以看下前面的文章:
InputReaderThread::InputReaderThread(const sp<InputReaderInterface>& reader) :
Thread(/*canCallJava*/ true), mReader(reader) {
}
InputReaderThread::~InputReaderThread() {
}
bool InputReaderThread::threadLoop() {
mReader->loopOnce();
return true;
}
InputDispatcherThread
要点如下:
- 运行了run()方法后,最终会执行到threadLoop()方法,这个方法只有在执行requestExit()后才会停止循环
- threadloop()中执行了InputDispatcher.dispatchOnce()方法,开始分发从InputReader那边接收的事件。
对InputDispatcher.dispatchOnce()的内容由兴趣的读者可以看下前面的文章:
InputDispatcherThread::InputDispatcherThread(const sp<InputDispatcherInterface>& dispatcher) :
Thread(/*canCallJava*/ true), mDispatcher(dispatcher) {
}
InputDispatcherThread::~InputDispatcherThread() {
}
bool InputDispatcherThread::threadLoop() {
mDispatcher->dispatchOnce();
return true;
}
以上是关于由浅入深学习android input系统 - input系统的启动的主要内容,如果未能解决你的问题,请参考以下文章
由浅入深学习android input系统 - input系统的启动
由浅入深学习android input系统 - input事件采集(InputReader)
由浅入深学习android input系统 - input事件采集(InputReader)
由浅入深学习android input系统 - input事件如何传递到View