Activity只负责生命周期和事件处理
Window只控制视图
一个Activity包含一个Window,如果Activity没有Window,那就相当于Service
AMS统一调度所有应用程序的Activity
WMS控制所有Window的显示与隐藏以及要显示的位置
在视图层次中,Activity在WIndow之上,如下图
是Android应用的主线程(UI线程)
管理的整个系统所有窗口的UI
作用:
什么是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中有定义。
使用的设计模式:
桥接模式
http://www.runoob.com/design-pattern/bridge-pattern.html
解惑:
Q:WMS是系统服务,有SystemServer负责启动,启动时机相对较晚,那么在WMS运行之前,终端显示屏就一团黑?
A:在WMS启动之前,系统只需显示开机动画,它们都有特殊的方式来向屏幕输出图像,比如直接通过OpenGL ES与SurfaceFling的配合来完成。这也从侧面告诉我们,要想在Android上显示UI,并不一定要通过WMS。
ActivityManager是客户端用来管理系统中正在运行的所有Activity包括Task、Memory、Service等信息的工具。但是这些这些信息的维护工作却不是又ActivityManager负责的。在ActivityManager中有大量的get()方法,那么也就说明了他只是提供信息给AMS,由AMS去完成交互和调度工作。
作用:
设计模式:
代理模式
http://www.runoob.com/design-pattern/proxy-pattern.html
从类图可以看出,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()