Android 4.2 由Context引发的思考.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Android 4.2 由Context引发的思考

Android 4.2 由Context引发的思考目录(?)[-]问题描述复现步骤期望结果实际结果问题分析Dialog显示流程图重要方法1 addWindowToListInOrderLocked 2updateFocusedWindowLocked解决方案总结知识点注 最近在做类似于三星S4的那种皮套(后面简称SmartCover),具有可操作的窗口,一方面用户可以保护手机屏幕,另一方面用户可以直接在SmartCover上接听电话,非常方便。在开发过程中发现一个问题,虽然最终解决但还是记录一下,好记性不如烂笔头啊。转载请务必注明出处:/yihongyuelan问题描述:SmartCover滑动控件失效复现步骤:1.当前正在通话,长按Power键弹出关机对话框2.关闭SmartCover3.滑动挂断按钮,挂断当前通话期望结果:正常滑动挂断按钮并能挂断当前通话实际结果:无法滑动挂断按钮问题分析: 在关机对话框(GlobalActions)弹出之后,SmartCover就无法接收点击事件了,同时打开SmartCover后会发现之前的点击事件传到了关机对话框上。SmartCover的显示是基于Dialog的,是一个自定Dialog。虽然能够正常显示,却没法获取点击事件,那这就得从Android的事件派发来分析问题了! 我们知道在Android中事件的派发可以分为两类:按键事件和触摸事件 无论是哪种事件,这些消息首先都会被硬件设备所检测到,比如我们点击Home键,对硬件来说只会检测到Down/Up,这些硬件消息会被转换成统一的系统消息,并向上逐层传递。 接下来,Android的窗口管理系统(WmS)会根据窗口的状态,判断用户正在与哪个窗口进行交互,然后把消息派发给该窗口。在Android系统中,所有的窗口都是有WmS创建的,因此WmS可以查出所有窗口的状态,包括窗口大小、位置、是否具有焦点等等。当底层消息传递上来时,如果是按键消息,则直接派发给当前窗口;如果是触摸消息,则WmS会根据触摸消息判断用户触摸区域属于哪个窗口,并将消息传递给该窗口。 最后这些消息如何处理就是窗口自己的事儿了,也就是View的处理逻辑了,dispatchEvent,onTouchEvent等等。 当问题发生时,我们可以点击屏幕,但消息没有传递给SmartCover,反而传递给了关机对话框,因此问题的大致原因可能是WmS在派发消息时出现了问题。 既然问题可能出现在WmS中,自然需要查看WmS的Log,因为WmS的Log属于system log,而Android默认打印的log也就是adb logcat直接输出的log是main log,所以需要加-b 指定buffer,同时我们需要过滤WindowManager这个TAG(WmS的Log TAG是WindowManager),所以在终端中输入:adb logcat -b system -s WindowManager 然后按照复现步骤操作一遍并查看log。当在通话界面长按Power键之后会出现以下Log:[plain]view plaincopyV/WindowManager( 536): Changing focus from Window{424ce3f0 u0 com.android.phone /com.android.phone.InCallScreen} to Window{4232b120 u0 GlobalActions} 也就是说这时候的焦点从InCallScreen变到了GlobalActions上,GlobalActions就是关机对话框,这里没有问题。但当我们关闭SmartCover时,WmS没有焦点变化的Log输出。 对比以没有关机对话框的Log:[plain]view plaincopyV/WindowManager( 536): Changing focus from Window{424ce3f0 u0 com.android.phone /com.android.phone.InCallScreen} to Window{4232b120 u0 com.android.phone/com.and roid.phone.InCallScreen} 我们可以看到如果没有关机对话框,在通话界面关闭SmartCover时会有焦点改变,只是焦点还在InCallScreen上,毕竟SmartCover弹出的Dialog是基于InCallScreen的(Context是InCallScreen),因此焦点还是属于InCallScree

文档评论(0)

shuwkb + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档