zoukankan      html  css  js  c++  java
  • Framework概述

    Framework概述

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

    服务端:
    包含两个重要的类,分别是WindowManagerService(WmS),作用是:各窗口的叠放次序,隐藏或者显示窗口,和ActivityManagerService(AmS),作用是:管理所有的应用程序中的Activity。
    除此之外,服务端还包括了两个消息处理类,KeyQ类:该类为WmSd的内部类,继承于KeyInputQueue类,KeyQ对象一旦创建,就立即启动一个线程,该线程会不断地读取用户UI操作的消息,比如按键、触摸屏幕、trackball、鼠标等,并把这些消息放到一个消息队列QueueEvent类中。这里的QueueEvent类应该就是我们平时所说的MessageQueue类吧。
    InputDispatcherThread类:该类的对象一旦创建,也会立即启动一个线程,该线程会不断地从QueueEvent中取出用户消息类并进行一定的过滤,过滤后,再将这些消息发送给当前活动的客户端程序中。
     
    客户端:
    有以下重要的类,
    ActivityThread类:该类作为应用程序的主线程类,所有的APK程序都有且仅有一个ActivityThread类,程序的入口为该类的static main()函数,ActivityThread所在的线程为UI线程。
    Activity类:该类为APK程序的一个最小的运行单元,换句话说就是主线程可以动态加载可执行代码的最小单元类,一个APK程序中可以包含多个Activity对象,ActivityThread会根据用户操作选择动态加载哪个Activity对象。
    PhoneWindow类:该类继承于Window类,同时PhoneWindow类内部包含了一个DecorView对象,DecorView的父类是FrameLayout,因此,该PhoneWindow是内含一个View对象,并且提供了一组通用窗口操作API。
    Window类:该类提供了一组通用的窗口操作API,这里的窗口仅仅是客户端程序层面上的,WmS所管理的窗口并不是Window类,而是一个View或者ViewGroup类,对于PhoneWindow类而言,就是其内部包含的DectorView类,Window是一个abstract类型。
    DecorView类:该类是一个FrameLayout的子类,并且是PhoneWindow中的一个内部类,Decor的英文是Decoration,即,修饰的意思,DecorView就是对普通的FrameLayout进行了一定的修饰,比如添加一个Title bar,并响应特定的按键消息。
    ViewRoot类:WmS管理客户端窗口时,需要通知客户端进行某种操作,这些操作都是IPC调用完成的,而在客户端窗口收到IPC调用后,都会把该类转换为本地的一个异步的调用,实现方式就是使用Handler,ViewRoot就是继承于Handler,其作用就是把WmS的IPC调用转换为本地的一个异步调用。
    W类:继承于Binder类,并且是ViewRoot的一个内部类,WmS通知客户端窗口时,是通过IPC调用,也就是调用到该Binder类,然后该Binder类内部的处理函数一般会给该类所在的ViewRoot发送一个Handler消息,以便进行异步处理。
    WindowManager类:客户端要申请创建一个窗口,而具体创建窗口的任务是由WmS完成的,WindowManager类就像一个部门经理,谁有什么需求就告诉它,由它和WmS进行交互,客户端不能直接和WmS进行交互。
    了解了上面相应类的作用之后,下面介绍一个APK程序的运行过程:
    首先,ActivityThread从main()函数开始执行,调用prepareMainLooper()为UI线程创建一个消息队列(MessageQueue).然后创建一个ActivityThread对象,在ActivityThread的初始化代码中会创建一个Handler对象和一个ApplicationThread(Binder)对象。其中的Binder对象负责接收远程AmS的IPC调用,接收到调用后,则通过Handler把消息发送到消息队列,UI线程会异步地从消息队列中取出消息并执行相应的操作。比如start,stop,pause等。接着UI线程调用Looper.loop()方法进行消息循环体,进入后就会不断地从消息队列中读取并处理消息。
    当ActivityThread接收到AmS发送某个Activity之后,就会创建指定的Activity对象,Activity又会创建PhoneWindow类--DecorView类--创建相应的View类或者ViewGrop,创建完成之后,Activity需要把创建好的界面现实到屏幕上,于是调用了WindowManager类,于是后者创建一个ViewRoot对象,该对象实际上创建了ViewRoot类和W类,创建ViewRoot对象之后,WindowManager再调用WmS提供的远程接口完成添加一个窗口并显示到屏幕上。
    接下来,用户开始在程序界面上操作,KeyQ线程不断把用户消息存储到QueueEvent队列中,InputDispatcherThread线程逐个取出消息,然后调用WmS的相应函数处理该消息,当WmS发现消息属于客户端的某个窗口的时候,就会调用相应窗口的W接口。
    W类是一个Binder,负责接收WmS的IPC调用,并把调用的消息传递给ViewRoot,ViewRoot再把消息传递给UI主线程ActivityThread,ActivityThread解析该消息并做相应的处理,在客户端程序中,首先处理程序的是DecorView类,如果DecorView不想处理某个消息,则可以把该消息传递给其内部包含的子View或者ViewGrop,如果还没有处理,则传递给PhoneWindow,最后再传递给Activity。
     
    客户端中的线程:
    Android的APK程序中都有哪些线程呢?
    很明确地讲,包含Activity的客户端程序至少包含三个线程,每个Binder对象都对应一个线程,Activity启动之后会创建一个ViewRoot.W对象,同时ActivityThread会创建一个ApplicationThread对象,这两个对象都继承于Binder,因此会启动两个线程,负责接收LinuxBinder驱动发送的IPC调用,最后一个主要线程就是本程序所在的线程,也叫作用户交互(UI)线程,因为所有的处理用户消息以及绘制界面的工作都在该线程中完成。
     
    自定义个Thread和UI线程有什么区别?
    UI线程是从ActivityThread运行的,在该类的main()方法中,已经使用Looper.prepareMainLooper()为该线程添加Looper对象,即已经为该线程创建了消息队列(MessageQueue),因此,我们才能够在Activity中定义Handler对象,(因为声明Handler对象的时候,所在的线程必须已经创建了MessageQueue),而普通的自定义的Thread是一个裸线程,因此不能直接在Thread中定义Handler对象,从使用场景来讲,即不能直接给Thread对象发送消息,但是却可以给UI线程发送消息。

     

    Android窗口管理服务WindowManagerService显示窗口动画的原理分析

    http://blog.csdn.net/luoshengyang/article/details/8611754

    来源:http://blog.sina.com.cn/s/blog_49f62c3501010aml.html

     
  • 相关阅读:
    POJ 1611 The Suspects
    POJ 2001 Shortest Prefixes(字典树)
    HDU 1251 统计难题(字典树 裸题 链表做法)
    G++ C++之区别
    PAT 乙级 1013. 数素数 (20)
    PAT 乙级 1012. 数字分类 (20)
    PAT 乙级 1009. 说反话 (20)
    PAT 乙级 1008. 数组元素循环右移问题 (20)
    HDU 6063 17多校3 RXD and math(暴力打表题)
    HDU 6066 17多校3 RXD's date(超水题)
  • 原文地址:https://www.cnblogs.com/yzmb/p/5459950.html
Copyright © 2011-2022 走看看