Framework概述

来源:互联网 发布:热电材料 知乎 编辑:程序博客网 时间:2024/06/06 13:11

Framework框架,同样包含三个部分:服务端、客户端和Linux驱动。

服务端包含两个重要的类

ActivityManagerService.java 管理应用程序中的Activity

WindowManagerService.java 管理窗口

 

客户端中重要的类

ActivityThread类,所在线程即为UI线程

DecorView类是FrameLayout的子类,并且是PhoneWindow的内部类,可添加ActionBar,响应特定的按键消息。

Window类提供了一组通用的窗口操作API

PhoneWindow类继承于Window类,内部包含一个DecorView对象

ViewRoot类继承于Handler,其作用是把WMS的IPC调用转换为本地的一个异步调用,每创建一个窗口,都会相应的生成一个ViewRoot对象,用以和WmS进行交互

W类也是继承于Binder,并且是ViewRoot的一个内部类,WmS通知客户端窗口,是通过调用W类把消息发送个ViewRoot,以便进行异步处理

View类是WMS认为的窗口,本身不能接收WmS传递过来的消息,真正接收用户消息是ViewRoot.W类,每个W类都包含了一个View变量

WindowManager类是客户端和WmS交互的中介


APK运行过程

ActivityThread从main()函数开始, 调用prepareMainLooper()为UI线程创建一个消息队列,然后创建一个ActivityThread对象,负责接收AmS的IPC调用。

  public static final void main(String[] args) {        SamplingProfilerIntegration.start();        Process.setArgV0("<pre-initialized>");        Looper.prepareMainLooper();        if (sMainThreadHandler == null) {            sMainThreadHandler = new Handler();        }        ActivityThread thread = new ActivityThread();        thread.attach(false);        if (false) {            Looper.myLooper().setMessageLogging(new                    LogPrinter(Log.DEBUG, "ActivityThread"));        }        Looper.loop();        if (Process.supportsProcesses()) {            throw new RuntimeException("Main thread loop unexpectedly exited");        }        thread.detach();        String name = (thread.mInitialApplication != null)            ? thread.mInitialApplication.getPackageName()            : "<unknown>";        Slog.i(TAG, "Main thread of " + name + " is now exiting");    }


当ActivityThread接收到启动某个Activity的IPC命令后,则会创建一个activity对象,接着Activity创建PhoneWindow类->DecorView类->View类,最后显示到屏幕上。

W类负责接收WmS的IPC调用,再把消息传递给ViewRoot,ViewRoot再把消息传递给ActivityThread,ActivityThread做解析后,转给DecorView处理,如果DecorView不处理,再转给其内部的View处理,如果还没处理,则传给PhoneWindow,最后再传递给Activity。


ViewRoot类和W类是何时创建的,待更新。



原创粉丝点击