【Android】Activity Window WMS源码关系流程

本文详细探讨了Android中Activity、Window和WMS(Window Manager Service)的关系,从类图、相关概念到执行步骤。重点介绍了ActivityThread、PhoneWindow、DecorView、WindowManager以及ViewRootImpl的角色和交互过程,特别是窗口的创建、添加和显示流程。
摘要由CSDN通过智能技术生成

一、类图关系

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,
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值