一、类图关系
system_server_AMS类图_1:
Activity_Window_相关类图:
system_server_AMS类图_2:
总体类图:
流程图:
二、相关概念
1、ActivityThread:为应用程序的主线程类,所有的APK程序都有且仅有一个ActivityThread,程序的入口为该类static main()函数
Activity:Activity包含一个Window,该Window在Activity的attach方法中通过调用new PhoneWindow()创建一个window;
2、PhoneWindow:继承Window类,是把一个FrameLayout进行一定的包装,并提供了一组通用的窗口操作接口,内部包含一个DecorView
3、View:最基本的UI组件,表示屏幕上的一个矩形区域;
4、DecorView:该类是一个 FrameLayout 的子类,并且是 PhoneWindow 中的一个内部类。Decor的英文是 Decoration,即“修饰”的意思,DecorView 就是对普通的 FrameLayout 进行了一定的修饰,比如添加一个通用的 Title bar,并响应特定的按键消息等。;
5、Window:表示顶层窗口,管理界面的显示和事件的响应;每个Activity 均会创建一个PhoneWindow对象,是Activity和整个View系统交互的接口,该类提供了一组通用的窗口(Window)操作 API,这里的窗口仅仅是程序层面上的,WMS 所管理的窗口并不是 Window 类,而是一个 View 或者 ViewGroup 类,一般就是指DecorView 类,即一个 DecorView 就是 WmS 所管理的一个窗口。Window 是一个 abstract 类型。
6、WindowManager:一个interface,继承自ViewManager。所在应用进程的窗口管理器;有一个implementation WindowManagerImpl;
主要用来管理窗口的一些状态、属性、view增加、删除、更新、窗口顺序、消息收集和处理等。
7、ViewRootImpl:通过IWindowSession接口与全局窗口管理器进行交互:界面控制和消息响应;WMS 管理客户端窗口时,需要通知客户端进行某种操作,这些都是通过异步消息完成的
三、步骤
Step1:
当启动Activity时,system_server进程通过AMS(ActivityManagerService)的远程代理ApplicationThreadProxy(即应用进程的Binder,IApplicationThread)的scheduleLaunchActivit(),标示SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION,底层binder驱动启动应用进程XXXActivity,到应用进程的ActivityThread的内部类ApplicationThread的父类ApplicationNative的onTransact,再到scheduleLaunchActivity().
Step2:
ApplicationThread的scheduleLaunchActivity:通过sendMessage(H.LAUNCH_ACTIVITY, r),发到UI线程的ActivityThread 的H处理即handleLaunchActivity:
ActivityThread.java:
public final class ActivityThread {
private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {
// Initialize before creating the activity
WindowManagerGlobal.initialize();
Activity a = performLaunchActivity(r, customIntent);
if (a != null) {
r.createdConfig = new Configuration(mConfiguration);
reportSizeConfigurations(r);
Bundle oldState = r.state;
handleResumeActivity(r.token, false, r.isForward,
!r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);
...
}
}
}
其中WindowManagerGlobal.initialize;是先取到WMS(WindowManagerService)的远程代理IWindowManager
WindowManagerGlobal.java:
public final class WindowManagerGlobal {
public static void initialize() {
getWindowManagerService();
}
public static IWindowManager getWindowManagerService() {
synchronized (WindowManagerGlobal.class) {
if (sWindowManagerService == null) {
sWindowManagerService = IWindowManager.Stub.asInterface(
ServiceManager.getService("window"));
try {
sWindowManagerService = getWindowManagerService();
ValueAnimator.setDurationScale(sWindowManagerService.getCurrentAnimatorScale());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
return sWindowManagerService;
}
}
}
Activity a = performLaunchActivity(r, customIntent);使用ClassLoader加载XXXActivity,这其中会创建ContextImpl、如果Application还没启动过,会先把Applicaition创建并onCreate,然后调用XXXActivity的attach();
在attach中:会创建改activity的对应的window即PhoneWindow,以及phoneWindow和WindowManagerImpl关联:
Activity:
final void attach(Context context, ActivityThread aThread,
Instrumentation instr, IBinder token, int ident,