• Android内核剖析读书笔记(1)—Framework概述


    一、Framework组成


    1.服务端组成

    a.WindowManagerService
        决定各窗口的叠放次序、隐藏或者显示窗口
    b.ActivityManagerService
      管理应用程序中所有的activity
    c.KeyQ
      Wms内部类,继承于KeyInputQueue,一旦创建就会立即启动一个线程负责读取用户的UI相关操作,如,按键、触摸屏等,并把消息放到QueueEvent类中
    d.InputDispatcherThread
      一旦创建立即启动一个线程从QueueEvent读取用户消息,并进行过滤,然后发给当前活动的客户端程序

    2.客户端组成

    a.ActivityThread
         应用程序主线程类,所有APK程序有且仅有一个ActivityThread类,该类所在线程即为UI线程或主线程
    b.Activity
         主线程动态加载可执行代码的最小单元,一个APK程序可包含多个Activity类,ActivityThread类会根据用户操作选择加载哪一个Activity
    c.DectorView
         FrameLayout的子类,对FrameLayout进行一定的修饰
    d.Window
         提供一组通用窗口操作的API,Wms管理的不是该window,而是View或ViewGroup,也就PhoneWindow内部包含的DectorView
    e.PhoneWindow
         继承于Window,内部包含一个DectorView
    f.ViewRoot
         继承于Handler,把Wms的IPC调用转化为本地的一个异步调用;因为Wms在管理客户端窗口时,会通过IPC调用通知客户端进行某种操作,而客户端收到IPC调用请求后就会通过Handler转化为本地的一个异步调用
    g.W类
         继承于Binder类,并且是ViewRoot的内部类,Wms通知客户端窗口时,通过IPC调用,也就是调用到该Binder对象,然后该Binder会对该类所在的ViewRoot对象发送一个Handler消息,以便进行异步处理
    h.WindowManager
         负责客户端申请创建窗口的任务,与Wms进行交互,客户端就不用与Wms进行交互


    3.Linux驱动

    a.SurfaceFlingger(SF)
     对应每一个窗口,把各个Surface显示在同一个屏幕上
    b.Binder
      提供跨进程的消息传递

    二、APK程序的运行过程


    a.ActivityThread.main()----->ActivityThread.prepareMainLoper(),为UI线程创建一个消息队列

    b.创建ActivityThread对象----->创建一个Handler和ApplicationThread(Binder,负责接收远程Ams的IPC调用,通过前面创建的Handler把消息发送到消息队列中,UI线程异步取出消息并执行相关操作)

    c.Ams.startActivity--->ActivityThread创建指定的Activity---->Activity创建PhoneWindow类--->DectorView--->View或者ViewGroup---->调用WindowManager创建ViewRoot并调用Wms的远程接口完成添加一个创建并显示在屏幕上

    d.KeyQ接受用户的操作并存储到QueueEvent队列中,InputdispatcherThread线程逐个取出消息,调用Wms中的相应函数进行处理,Wms调用相应窗口的W接口

    e.W类接受Wms的IPC调用--->把消息传递给ViewRoot---->Viewroot传递给UI线程ActivityThread-->ActivityThread解析该消息并作相应处理

    三、客户端中的线程

    1.Android APK程序都有哪些进程?

    如图所示,共有三个线程,一个Main线程外加两个Binder线程(对应ActivityThread创建的ViewRoot.W和ApplicationThread,负责接收Linux驱动发送的IPC调用)

    2.什么是UI线程?

    负责处理所有的用户消息以及绘制界面

    3.自定义Thread与UI Thread的区别?

    UI线程在ActivityThread中运行,已经为其创建了消息队列,用户可直接在UI线程中使用Handler,而自定义线程是一个裸线程,不能直接使用Handler,需创建消息队列和消息循环,即:
    new Thread(new Runnable() {
        public void run() {
            Looper.prerpareLooper();
            //处理业务逻辑
            Looper.loop();
        }
    }).start();


    四、几个常见问题?

    1.Activity如何传递消息?

      a.利用Application共享,每个Activity对应的Application是唯一的
      b.Intent
      c.利用SharedPreference、文件、数据库进行

    2.窗口的相关概念
     a.窗口(非Window类):
         程序员或用户看到屏幕上的一个独立界面,如Activity、对话框、菜单等.对于Wms,窗口是接收用户消息的最小单元,添加一个窗口就是添加一个View,Wms判断消息来自哪个View,然后通过IPC调用把这个消息传递给客户端的ViewRoot.W子类
     b.Window类:
         一个抽象类,抽象了客户端窗口的基本操作,并定义了一组Callback接口,Activity就是通过此接口来获得对消息的处理机会

    c.ViewRoot类:
         客户端(WindowManager)创建窗口时的一个代理,用来和Wms进行交互,通过其内部的W类.Wms管理的每个窗口都会对应一个ViewRoot类
    d.W类
         ViewRoot的一个内部类,继承与Binder,用于向Wms提供一个IPC接口,从而让Wms控制窗口客户端的行为

  • 相关阅读:
    密文搜索
    poj 1182 食物链
    1147. Heaps (30)
    1146. Topological Order (25)
    1145. Hashing
    1142. Maximal Clique (25)
    fzu 2112 tickets
    51nod 1554 欧姆诺姆和项链
    codeforces 963B Destruction of a Tree
    hdu 3294 Girls' research
  • 原文地址:https://www.cnblogs.com/zsw-1993/p/4879930.html
Copyright © 2020-2023  润新知