本来想通过看老罗的书来学习这部分的源码,但实际对比发现8.0的android已经和老罗那时候的很大不一样,所以决定自己写一下,也当做笔记.
从名字就可以知道,InputManagerService是跟输入有关的,这不单单指键盘,只要是挂载在dev/input下面的设备都和它有关。
InputManagerService的启动
InputManagerService是在SystemServe
r的startOtherServices
中被初始化和启动的,此方法巨长,1200多行,我这里只贴和InputManagerService相关的部分。
private void startOtherServices() {
...
InputManagerService inputManager = null;
...
traceBeginAndSlog("StartInputManagerService");
inputManager = new InputManagerService(context);
traceEnd();
...
wm = WindowManagerService.main(context, inputManager,
mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
!mFirstBoot, mOnlyCore, new PhoneWindowManager());
ServiceManager.addService(Context.WINDOW_SERVICE, wm);
ServiceManager.addService(Context.INPUT_SERVICE, inputManager);
traceEnd();
...
traceBeginAndSlog("StartInputManager");
inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
inputManager.start();
traceEnd();
...
}
可以看到,首先会调用InputManagerService的构造函数。构造函数的源码如下:
public InputManagerService(Context context) {
this.mContext = context;
this.mHandler = new InputManagerHandler(DisplayThread.get().getLooper());
mUseDevInputEventForAudioJack =
context.getResources().getBoolean(R.bool.config_useDevInputEventForAudioJack);
Slog.i(TAG, "Initializing input manager, mUseDevInputEventForAudioJack="
+ mUseDevInputEventFo