Framework概述

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类是何时创建的,待更新。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值