Android input之IMS初始化,android项目实例源码

//frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp
static jlong nativeInit(JNIEnv* env, jclass /* clazz */,
jobject serviceObj, jobject contextObj, jobject messageQueueObj) {
sp messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj);
if (messageQueue == nullptr) {
jniThrowRuntimeException(env, “MessageQueue is not initialized.”);
return 0;
}

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

这里创建了一个本地的InputManager,继续跟踪:

//frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp
NativeInputManager::NativeInputManager(jobject contextObj,
jobject serviceObj, const sp& looper) :
mLooper(looper), mInteractive(true) {
JNIEnv* env = jniEnv();

mServiceObj = env->NewGlobalRef(serviceObj);

{
AutoMutex _l(mLock);
mLocked.systemUiVisibility = ASYSTEM_UI_VISIBILITY_STATUS_BAR_VISIBLE;
mLocked.pointerSpeed = 0;
mLocked.pointerGesturesEnabled = true;
mLocked.showTouches = false;
mLocked.pointerCapture = false;
mLocked.pointerDisplayId = ADISPLAY_ID_DEFAULT;
}
mInteractive = true;

mInputManager = new InputManager(this, this);
}

可以看到,NativeInputManager本身只是一层壳,真正有料的是InputManger,InputManager的实现如下:

//frameworks/native/services/inputflinger/InputManager.cpp
InputManager::InputManager(
const sp& readerPolicy,
const sp& dispatcherPolicy) {
mDispatcher = new InputDispatcher(dispatcherPolicy);
mClassifier = new InputClassifier(mDispatcher);
mReader = createInputReader(readerPolicy, mClassifier);
initialize();
}

void InputManager::initialize() {
mReaderThread = new InputReaderThread(mReader);
mDispatcherThread = new InputDispatcherThread(mDispatcher);
}

终于看到,InputDispatcher和InputReader以及相应的mReaderThread和mDispatcherThread线程的创建。线程是载体,主要的做事人还是mDispatcher和mReader。 一张图总结:

image

IMS服务start

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

==========

如上只是创建了InputReader和InputDispatcher对象和相应的线程,那在哪里启动的线程呢?InputManager中有一个start方法:

//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;
}

这里会调用两个线程的run方法,从而启动线程。而各自的threadLoop方法中,实际做了如下事情:

//frameworks/native/services/inputflinger/InputReaderBase.cpp
bool InputReaderThread::threadLoop() {
mReader->loopOnce();
return true;
}
//frameworks/native/services/inputflinger/InputDispatcher.cpp
bool InputDispatcherThread::threadLoop() {
mDispatcher->dispatchOnce();
return true;
}

各自跑到了InputReader和InputDispatcher的方法中。所以说线程只是个载体,真正的精华在InputReader和InputDispatcher类中。 如上的start方法,实际上也是java层的调用。SystemService在构造了InputManageService服务后,调用了它的start方法启动服务,方法实现如下:

//frameworks/base/services/core/java/com/android/server/input/InputManagerService.java
public void start() {
Slog.i(TAG, “Starting input manager”);
nativeStart(mPtr);

r/input/InputManagerService.java
public void start() {
Slog.i(TAG, “Starting input manager”);
nativeStart(mPtr);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值