ActivityThread,AMS,WMS的工作原理

Activity与Window:

Activity只负责生命周期和事件处理

Window只控制视图

一个Activity包含一个Window,如果Activity没有Window,那就相当于Service

 

AMS与WMS:

AMS统一调度所有应用程序的Activity

WMS控制所有Window的显示与隐藏以及要显示的位置

在视图层次中,Activity在WIndow之上,如下图

 

 

ActivityThread:

是Android应用的主线程(UI线程)

ActivityThread,AMS,WMS的工作原理_第1张图片

 

WMS(WindowManagerService)

管理的整个系统所有窗口的UI

作用:

  1. 为所有窗口分配Surface客户端向WMS添加一个窗口的过程,其实就是WMS为其分配一块Suiface的过程,一块块Surface在WMS的管理下有序的排布在屏幕上。Window的本质就是Surface。(简单的说Surface对应了一块屏幕缓冲区
  2. 管理Surface的显示顺序、尺寸、位置
  3. 管理窗口动画
  4. 输入系统相关:WMS是派发系统按键和触摸消息的最佳人选,当接收到一个触摸事件,它需要寻找一个最合适的窗口来处理消息,而WMS是窗口的管理者,系统中所有的窗口状态和信息都在其掌握之中,完成这一工作不在话下。

什么是Window

“Window”表明它是和窗口相关的,“窗口”是一个抽象的概念,

从用户的角度来讲,它是一个“界面”;

从SurfaceFlinger的角度来看,它是一个Layer,承载着和界面有关的数据和属性;(SurfaceFlinger是Android multimedia(多媒体)的一个部分,在Android 的实现中它是一个service,提供系统 范围内的surface composer功能,它能够将各种应用 程序的2D、3D surface进行组合。

从WMS角度来看,它是一个WIndowState,用于管理和界面有关的状态。

比喻:

整个界面就像由N个演员参与的话剧:SurfaceFling是摄像机,它只负责客观的捕捉当前的画面,然后真实的呈现给观众;

WMS就是导演,它要负责话剧的舞台效果、演员站位;

ViewRoot就是各个演员的长相和表情,取决于它们各自的条件与努力。

可见,WMS与SurfaceFling的一个重要区别就是——后者只做与“显示”相关的事情,而WMS要处理对输入事件的派发。

 

Android支持的窗口类型很多,统一可以分为三大类,另外各个种类下还细分为若干子类型,且都在WindowManager.java中有定义。

  1. Application Window
  2. SystemWindow
  3. Sub Window

 

使用的设计模式

桥接模式

http://www.runoob.com/design-pattern/bridge-pattern.html

ActivityThread,AMS,WMS的工作原理_第2张图片

解惑

Q:WMS是系统服务,有SystemServer负责启动,启动时机相对较晚,那么在WMS运行之前,终端显示屏就一团黑?

A:在WMS启动之前,系统只需显示开机动画,它们都有特殊的方式来向屏幕输出图像,比如直接通过OpenGL ES与SurfaceFling的配合来完成。这也从侧面告诉我们,要想在Android上显示UI,并不一定要通过WMS。


AMSActivityManagerService

ActivityManager是客户端用来管理系统中正在运行的所有Activity包括Task、Memory、Service等信息的工具。但是这些这些信息的维护工作却不是又ActivityManager负责的。在ActivityManager中有大量的get()方法,那么也就说明了他只是提供信息给AMS,由AMS去完成交互和调度工作。

作用

  1. 统一调度所有应用程序的Activity的生命周期
  2. 启动或杀死应用程序的进程
  3. 启动并调度Service的生命周期
  4. 注册BroadcastReceiver,并接收和分发Broadcast
  5. 启动并发布ContentProvider
  6. 调度task
  7. 处理应用程序的Crash
  8. 查询系统当前运行状态

 

设计模式

代理模式

http://www.runoob.com/design-pattern/proxy-pattern.html

ActivityThread,AMS,WMS的工作原理_第3张图片

从类图可以看出,ActivityManagerProxy和ActivityManagerNative都实现了IActivityManager,ActivityManagerProxy就是代理部分,ActivityManagerNative就是实现部分,但ActivityManagerNative是个抽象类,并不处理过多的具体逻辑,大部分具体逻辑是由ActivityManagerService承担,这就是为什么我们说真实部分应该为ActivityManagerService。

 

代码逻辑

启动流程

第一阶段:启动ActivityManagerService。

第二阶段:调用setSystemProcess。

第三阶段:调用installSystemProviders方法。

第四阶段:调用systemReady方法。

工作流程:

AMS的工作流程,其实就是Activity的启动和调度的过程,所有的启动方式,最终都是通过Binder机制的Client端,调用Server端的AMS的startActivityXXX()系列方法。所以可见,工作流程又包括Client端和Server端两个。

Client端流程

Launcher主线程捕获onClick()点击事件后,调用Launcher.startActivitySafely()方法。Launcher.startActivitySafely()内部调用了Launcher.startActivity()方法,Launcher.startActivity()内部调用了Launcher的父类Activity的startActivity()方法。

Activity.startActivity()调用Activity.startActivityForResult()方法,传入该方法的requestCode参数若为-1,则表示Activity启动成功后,不需要执行Launcher.onActivityResult()方法处理返回结果。

启动Activity需要与系统ActivityManagerService交互,必须纳入Instrumentation的监控,因此需要将启动请求转交instrumentation,即调用Instrumentation.execStartActivity()方法。

Instrumentation.execStartActivity()首先通过ActivityMonitor检查启动请求,然后调用ActivityManagerNative.getDefault()得到ActivityManagerProxy代理对象,进而调用该代理对象的startActivity()方法。

ActivityManagerProxy是ActivityManagerService的代理对象,因此其内部存储的是BinderProxy,调用ActivityManagerProxy.startActivity()实质是调用BinderProxy.transact()向Binder驱动发送START_ACTIVITY_TRANSACTION命令。Binder驱动将处理逻辑从Launcher所在进程切换到ActivityManagerService所在进程。

Server端流程

启动Activity的请求从Client端传递给Server端后,便进入了启动应用的七个阶段,这里也是整理出具体流程。

 

1)预启动

ActivityManagerService.startActivity()

ActivityStack.startActivityMayWait()

ActivityStack.startActivityLocked()

ActivityStack.startActivityUncheckedLocked()

ActivityStack.startActivityLocked()(重载)

ActivityStack.resumeTopActivityLocked()

2)暂停

ActivityStack.startPausingLocked()

ApplicationThreadProxy.schedulePauseActivity()

ActivityThread.handlePauseActivity()

ActivityThread.performPauseActivity()

ActivityManagerProxy.activityPaused()

completePausedLocked()

3)启动应用程序进程

第二次进入ActivityStack.resumeTopActivityLocked()

ActivityStack.startSpecificActivityLocked()

startProcessLocked()

startProcessLocked()(重载)

Process.start()

4)加载应用程序Activity

ActivityThread.main()

ActivityThread.attach()

ActivityManagerService.attachApplication()

ApplicationThread.bindApplication()

ActivityThread.handleBindApplication()

5)显示Activity

ActivityStack.realStartActivityLocked()

ApplicationThread.scheduleLaunchActivity()

ActivityThead.handleLaunchActivity()

ActivityThread.performLaunchActivity()

ActivityThread.handleResumeActivity()

ActivityThread.performResumeActivity()

Activity.performResume()

ActivityStack.completeResumeLocked()

6)Activity Idle状态的处理

7)停止源Activity

ActivityStack.stopActivityLocked()

ApplicationThreadProxy.scheduleStopActivity()

ActivityThread.handleStopActivity()

ActivityThread.performStopActivityInner()

你可能感兴趣的:(Android,Framework,ROM等)