Inpuit机制
当用户对手机进行操作时,对应的数据流将是下面一个概括的流程
- HW 如传感器,触摸屏(TP),物理按键(KP)等感知到用户操作后,触发相关的中断(ISR)传递给Kernel,Kernel相关的driver 对这些中断进行处理后,转化成标准的InputEvent。
- UserSpace 的System Server中的Input System则持续监听Kernel传递上来的原始InputEvent,对其进行进一步的处理后,变成上层APP可直接处理的Input Event,如button点击,长按,滑动等等。
- APP 对相关的事件进行处理后,请求更新相关的逻辑界面,而这个则由System Server中的WMS 等来负责。
- 相关的逻辑界面更新后,则会请求SurfaceFlinger来产生FrameBuffer数据,SurfaceFlinger则会利用GPU 等来计算生成。
- DisplaySystem/Driver 则会将FrameBuffer中的数据更新显示出来,这样用户才能感知到他的操作行为。
所以Android的交互是基于用户输入的一个反馈动作,下面我们来介绍Android的一个重要的子系统–Input子系统。
首先我们了解一下这个系统的初始化过程,在SystemServer初始化过程中,IMS和WMS被创建出来,其中IMS作为参数加入WMS的初始化中,其中还包括一个PhoneWIndowManager对象,当然WMS的monitor回调也传入IMS中
private void startOtherServices() {
inputManager = new InputManagerService(context);
wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,
new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);
inputManager.setWindowManagerCallbacks(wm.getInputManagerCallback());
inputManager.start();
}
看IMS的start方法,调用nativeStart方法,传入一个nativeInt生成的mPtr指针对象
IMS的构造方法中执行了nativeInit,这是个native方法,属于jni调用,该方法中创建了一个NativeInputManager实例,并且和java层使用的是同一个looper。
public InputManagerService(Context context) {
this.mContext = context;
this.mHandler = new InputManagerHandler(DisplayThread.get().getLooper());
mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue());
}
static jlong nativeInit(JNIEnv* env, jclass /* clazz */,
jobject serviceObj, jobject contextObj, jobject messageQueueObj) {
NativeInputManager* im = new NativeInputManager(contextObj, serviceObj,
messageQueue->getLooper());
}
NativeInputManager::NativeInputManager(jobject contextObj,
jobject serviceObj, const sp<Looper>& looper) :
mLooper(looper), mInteractive(true) {
mInputManager = new InputManager(this, this);
}
在NativeInputManager的初始化中创建了一个InputManager
InputManager::InputManager(
const sp<InputReaderPolicyInterface>& readerPolicy,
const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) {
mDispatcher = createInputDispatcher(dispatcherPolicy);
mClassifier = new InputClassifier(mDispatcher);
mReader = createInputReader(readerPolicy, mClassifier);
}
status_t InputManager::start() {
status_t result = mDispatcher->start();
result = mReader->start();
}
InputManager初始化时创建了两个重要操作类:InputReader和InputDispatcher。
InputManager的start方法,让两个线程run起来。