26
2017
09

View和输入法的通信原理

考虑下面一个简单的场景:在一个界面中,只有一个EditText控件,当点击该控件时,输入法便会被调起来,供用户输入使用,用户输入文字后,上屏到EdxitText当中,那么问题来了,View如何与输入法(InputMethodService 以下简称IMS)交互,
1,一个界面中可能存在多个View,哪个view应该和IMS沟通?即沟通标准是什么?
我们知道,只有获取焦点的View,才能和IMS交互,那么系统如何确定哪个View应该获取到焦点?
2,View和IMS沟通的过程中,Window和Activity扮演什么样的角色?
每个Activity都有一个单独的window,这个window是何时创建的?

window是在Actvity的attach方法中创建的(launchActivity时,调用attach方法,为Actvity一些主要成员变量赋值),其实例为phoneWindow,

View是依附于Window当中,二者的依附关系是如何建立的,

一般情况下,在onCreate()方法中,给Activity设置界面内容,常用方法是setContentView,其最终使用的是phoneWindow中的同名方法,首先判断DecorView是否已经存在,如果不存在,那么先生成DecorView,然后如果采用xml布局方式,该方法会将xml布局中的标签,解析成view,放置到DecorView当中存起来

View有时何时创建的,怎么创建的?Activity提供WindowManager,这个WindowManager具体是什么对象?WindowManager用于管理当前Window,主要管理哪些方法,更深层次的问题,WindowManager通过调起其内部的addView,将View添加到窗口中,添加之后,便会显示,为什么?ViewRootImpl的作用是啥,每个Activiy都应用一个ViewRoot? 为什么要设计Window这个类(具体实例是PhoneWindow)?Window 负责管理view:绘制、添加、删除、查找、替换、触摸事件处理

系统布局文件放在/frameworks/base/core/res/res/layout目录下
整个window的根布局是DecorView,其子类是系统的布局文件,系统提供了多种类型的布局文件,放在/frameworks/base/core/res/res/layout目录下
,根据不同的windowFeature,选择不同的布局文件,比如R.layout.screen_custom_title,这些布局文件,会被实例化成一个View对象,添加到DecorView当中,每一个布局文件中,都包含一个id为content的FrameLayout控件,这个控件最终被实例化为mContentParent,这个是App中内容的rootView,setContentView,其实是往这个rootView添加Activity的布局view,
Touch事件,首先DecorView传给对应的Activity,由其分发给Window,再由window分发给view处理,输入事件和IMS的关系是什么,为什么有些是按键处理,有些是触摸上屏?
3,View在App进程,IMS存在于另一个进程,两个不同的进程之间,是如何实现跨进程通信(IPC)的, (AIDL? 最终还是Binder)

上一篇:Android Err:no permissions (verify udev rules) 下一篇:NSSortDescriptor和NSPredicate的使用总结