位置: 编程技术 - 正文

Android系统触屏事件传递派发浅析(二)(android触屏事件的处理)

编辑:rootadmin

推荐整理分享Android系统触屏事件传递派发浅析(二)(android触屏事件的处理),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:安卓触屏,安卓显示触摸操作,android触屏事件的处理,安卓触屏,安卓系统触摸屏,安卓触屏设置在哪里,安卓触屏,安卓系统触摸屏,内容如对您有帮助,希望把文章链接给更多的朋友!

上一篇文章提到在InputDispatcher中,connection调用inputPublisher.publishMotionEvent后分发就完成了,然后将dispatchEntry放入到waitQueue队列,大概是有的事件必须等应用回复,收到应用回复后,dispatchEntry将从waitQueue队列中移出.

要弄明白事件如何传递给应用,不得不看看inputPublisher.publishMotionEvent这个函数了. 在InputTransport.cpp文件中看看函数的实现(省略了参数和赋值)

功能就是实例化InputMessage,调用InputChannel的sendMessage方法. InputChannel::sendMessage方法很简单,就是调用socket 的send方法发送InputMessage.有sendMessage 当然也有receiveMessage用来接收用户回复,这里略去不表,至此InputDispatcher的戏份全部完成.

上一文章末尾提到在WindowManagerService中有这么一个方法

这里的win是WindowState类的实例,通过调用makeInputChannelName返回一个String 类型name.然后调用openInputChannelPair返回一对InputChannel.上面提到InputChannel就是通过socket发送和接收数据. 之后InputDispatcher和应用就是通过这对InputChannel通信的.

顺便看看本地代码中openInputChannelPair的实现

是创建了一对UNIX域套接字. 再看看Java中openInputChannelPair的实现

调用的是nativeOpenInputChannelPair.

看看nativeOpenInputChannelPair

其实调用的还是本地代码中的openInputChannelPair.至此我们明白了在WindowManagerService中addWindow方法会创建一对InputChannel(本质是socket), 一个自己保存,一个传给InputDispatcher,至于怎么传递给InputDispatcher有时间再跟进去看看.

要理清应用如何与InputDispatcher通信,打开应用的入口类ActivityThread.java文件,我们看看performLaunchActivity这个方法.

这里只粘贴了代码的一部分,大概功能是通过反射机制创建一个用户activity的实例.然后调用activity的attach方法,让用户activity和ActivityThread关联起来.

打开Activity.java文件,看看attach方法

继续跟下去没有发现间接调用addWindow方法.也许是延迟创建窗口造成的.看看ActivityThread的handleResumeActivity方法

看这两行  a.mWindowAdded = true;  wm.addView(decor, l);  感觉是和addWindow相似,也没有其他看起来像是加载窗口的.先跟进去看看吧.ViewManager是个接口,WindowManager继承ViewManager接口,wm是Activity getWindowManager返回的, 往上跟, 其实是mWindow.getWindowManager返回的.只好看看mWindow的来头.

Android系统触屏事件传递派发浅析(二)(android触屏事件的处理)

Activity.java attach()方法中知道了mWindow的来头

PolicyManager.java 文件关于makeNewWindow()方法

利用java反射机制,创建一个sPolicy实例. 找到这个Policy类,看看makeNewWindow方法

进入PhoneWindow.java文件,可是没有找到getWindowManager的实现.PhoneWindow继承Window, 进Window.java看看. 找到了WindowManager相关的函数

WindowManagerImpl.java文件中

return new WindowManagerImpl(mDisplay, parentWindow); }

调用的比较深,总结起来就是ActivityThread类里,前面handleResumeActivity方法里提到的 wm.addView()方法其实就是调用WindowManagerImpl类的addView方法. 看看WindowManagerImpl类的addView方法

mGlobal这个实例是这么来的

又需要去WindowManagerGlobal里面去看看了. 找到addView方法,看看实现.里面会实例化一个ViewRootImpl类. 这里不再跟了,简单介绍一个ViewRootImpl. 每一个Activity都会有一个Window,每一个Window都会有一个ViewRootImpl.

在WindowManagerGlobal里面,会维护一个ViewRootImpl列表和View列表.ViewRootImpl列表里每一个ViewRootImpl用来实现Activity和WindowManagerService通信,View列表里每一个View是Activity的根View.

ViewRootImpl setView方法部分代码

构建一个InputChannel实例,然后调用mWindowSession.addToDisplay. mWindowSession看起来像是WindowManagerService 在ViewRootImpl端的代理, mWindowSession调用的方法实际上就是调用WindowManagerService端对应的方法. 可在WindowManagerService中没有找到addToDisplay这个方法.后来仔细查看,发现不是想当然的. 看看windowSession是如何得到的

windowSession是通过WindowManagerService的openSession方法得到的. 看看这个方法

原来mWindowSession是一个Session实例,而不是想当然的WindowManagerService.看看Session类的addToDisplay方法

构造方法中

mService就是WindowManagerService,所以ViewRootImpl调用addToDisplay最终调到WindowManagerService的addWindow方法.上一篇文章最后提到这个,至此,事件的获取,加工,到派送给应用全部通了.当然这只是理通了事件的大概流向,目前只是明白了每一个Activity通过ViewRootImpl一个socket对与InputDispatcher通信,具体事件如何传递给应用,有时间再跟进去分析.

Intent and Intent Filters 转载请注明出处:

Android 常用适配器总结 一,适配器.顾名思义,就是把一些数据给弄得适当,适合以便于在View上显示。可以看作是界面数据绑定的一种理解。它所操纵的数据一般都是一些比较

eclipse创建android项目出现error libz.so.1: cannot open shared object file:No such file or directory /home/~/mywork/kitKat/prebuilts/gcc/linux-x/host/i-linux-glibc2.7-4.6/bin/../lib/gcc/i-linux/4.6.x-google/../../../../i-linux/bin/as:errorwhileloadingsharedlibraries:libz.so.1:cannotopensha

标签: android触屏事件的处理

本文链接地址:https://www.jiuchutong.com/biancheng/378158.html 转载请保留说明!

上一篇:android 手把手教你照片墙应用实现,再多的图片也不怕OOM(android怎么样)

下一篇:Intent and Intent Filters

  • 税收筹划分为哪几类
  • 什么是试算平衡?如何进行试算平衡
  • 承销债券收取的承销费属于什么收入
  • 厂房设计费计入在建工程吗
  • 个税换电脑了还能查到之前的申报记录吗?
  • 离职补偿金入账
  • 货物无偿赠送分录
  • 生产过程中产品的质量保证体系
  • 没有留抵税用进项抵扣滞纳金可以吗?
  • 利润借方余额表示盈利还是亏损
  • 营改增后小规模纳税人如何报税
  • 小规模销项负数发票怎么做账
  • 当月未出账费用
  • 遗属补助是死亡当月发放还是次月发放
  • macos12支持设备
  • 企业所得税汇算清缴扣除标准2023
  • 网上申报税务局怎么操作
  • 新手应该怎么样
  • 笔记本电脑如何恢复出厂系统
  • 认缴制没有实资本会怎么样
  • 正版的win10多少钱
  • linux 分享文件
  • 存货周转率公式怎么算
  • Http请求-hutool工具类的使用
  • 非货币性资产投资计入什么科目
  • 只有使用权的房子能继承吗
  • php中td
  • yolov5的使用
  • 广告代理费收取比例
  • php 收邮件
  • html+php
  • 金融企业贷款损失
  • 在pycharm中配置python
  • java中同步有两种方法
  • 帝国cms会员注册天数自动升级会员组
  • 银行会计核算方法的特点
  • PostgreSQL 创建表分区
  • 未认证key
  • 固定资产大修理和更新改造的区别
  • 用友软件操作流程图片
  • 报销差旅费会计分录退回现金
  • 来料加工成本是多少
  • 税控系统技术维护费会计处理
  • 未完工属于什么科目
  • 退货对方不开具红字发票怎么办
  • 向银行借的款属于什么会计要素
  • 三代个税返还算什么费用
  • 年初建账考虑要点有哪些
  • 问答:分支机构是否需要设立账簿
  • 批发商品销售的方式有委托代销吗
  • sql not in 与not exists使用中的细微差别
  • sql 行号
  • mysql 5.7.24安装
  • Windows下MySQL5.7.18安装教程
  • vmware虚拟机无法打开内核设备怎么办
  • CentOS 5.4+OpenVZ+Vtonf打造VPS服务器的方法
  • win8命令提示符管理员怎么打开
  • Centos 6.4 64位版命令行下设置无线网卡教程
  • win7旗舰版升级win10教程
  • win8系统笔记本忘记开机密码怎么办
  • 物联网版块股票
  • android opencl
  • 信号处理函数 strdup
  • JavaScript实现99乘法表及隔行变色实例代码
  • android设置无标题
  • python框架scrapy
  • 残疾人就业保障金什么时候申报缴纳
  • 贵州省税务网上缴费平台
  • 宁波增值税普通发票有几联发票
  • 通用机油防伪查询
  • 物业管理用房如何申请
  • 网上交了购置税你要打印出来吗
  • 经开区税务局党委委员 副局长 杨兴爱
  • 福建省国家税务总局稽查局局长
  • 其他收入工会经费必须申报吗
  • 个人所得税申报怎么申报
  • 卷票发票丢失怎么办理
  • 内蒙古国税网上办税厅
  • 尤溪特产春节礼品
  • 北京市门头沟最西边有个塔子叫什么
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设