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)

4,一个App中可能有多个Window,那么哪一个window应该获取焦点呢?焦点是如何计算的?在WMS中有个updateFocusedWindowLocked(),专门用来更新角度窗口,这个方法什么时候才会调用呢?

一般来讲,在以下几种情况会被调用:添加window(addWindow),移除window(removeWindow),Window的可见性(WindowVisibilityChanged)发生变化时,不同Activity进行切换时, 当前Activity获取focused,会触发WMS(WMS.setFocusedApp()),为Activity添加启动窗口时(StartingWindow),移除Activity的时候(removeActivityFromHistoryLocked),relayoutWindow()

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值