文章标题

来源:互联网 发布:php 面相过程 编辑:程序博客网 时间:2024/06/05 00:21

Android 中 窗口:

  1. ViewImplement中w类 和 PhoneWindow有何关联

2.android 事件从哪里来,最后怎么分发到Activity里。

窗口究竟是什么,它有俩方面的含义,一方面是 android WMS (window Manager System)
对所有应用的界面窗口进行管理,并将各种触摸事件分发给相应的窗口,另一方面是代表
的样式,比如一个应用为了保证它所有的界面风格一致,或开发者为某个窗口设置特定的
风格样式。

创建一个window其实有俩个过程:

  1. activityThread 创建activity后, activity.attach() – > 此时会
    创建 new PhoneWindow()。并为之设置回调事件即activity,当有界面改变或者onContent()
    会回调到activity

    然后在设置setContentView()时,会调用mWindow.setContentView,在这个方法内,它会生成
    DecorView,并在DecorView内填充实际的layout,最后回调到activity

    PhoneWindow里

  2. 在activity的omResume – > setVisible方法里,makeVisible()会调用到getWindowManager() wm.addView()方法,
    将该这个窗口通知给android WMS,让WMS可以随时派发到它。

    这个过程是
    1 检查到addView() LayoutParams 的参数正确
    2 新建 view,LayoutParams,new ViewRootImpl(view.getContext()) 并加入到管理队列中

    最后交给 session.addDisplay提交到WMS

    所以从上面俩部分就可以看出 W类是ViewRootImpl内部的,WMS通过它分发事件。
    而PhoneWindow则是代表前台界面元素,内部保存了自己的DecorView。
    但它们联系紧密,共同发生作用。
    wm.addView(mDecor,getWindwo().getAttributes());

    事件是如何派发到Activity里面来的?

    1 在ViewRootImpl里 有 mInputHandle 处理从android管道发送过来的触摸信息。
    然后sendMessage handleMessage 交给 deliverPointerEvent();

    2 然后 在deliverPointerEvent()里转给mView处理

    3 此时如果View是DecorView,就将事件转发给它的CallBack – Activity

0 0
原创粉丝点击