ActivityManagerService、WindowManagerService相关解释

WindowManagerService
  • 运行与独立的进程system_server中
  • 当应用程序需要创建窗口时,通过进程通信的方式请求WMS窗口,由WMS向应用程序传递和窗口相关的交互消息
  • 所有程序的窗口都在服务端管理,窗口的显示和控制都在WMS里处理
  • mExitingTokens,保存了所有具有同一个token的WindowState
  • AppWindowToken继承于WindowToken,专门用于标识一个Activity,AppWindowToken里的token实际上就是指向一个Activity
  • ActivityManagerService通知应用启动的时候,在服务端生成一个token用于标识该Activity,并且把该token传递到应用客户端
    客户端的Activity在申请添加窗口时,以该token作为标识传递到WindowManagerService,同一个Activity中的主窗口,对话框窗口,
  • 菜单窗口都关联到同一个AppWindowToken
WindowManager
  • 一个接口,继承于ViewManager 调用addView()创建窗口时真正交互的是WindowManagerImpl
    子类:WindowManagerImpl
    创建:在activity的makeVisiable方法执行时会ViewManager wm= getWindowManager();进而会执行mWindowManager = mWindow.getWindowManager();最后会在Window类中看到这么一句:mWindowManager = new LocalWindowManager(wm, hardwareAccelerated);就是这里创建的
WindowManagerImpl
  • 管理单个应用的所有本地窗口
  • 在Client端,并不直接和WMS交互,而是直接和本地对象WindowManager(实际上是和WindowManager的实现类WindowManagerImpl)交互
    然后由WindowManager完成和WindowManagerService交互
ViewRootImpl
  • 本质上是一个Handler
  • ViewRootImpl和WMS之间的双向对话,主要通过以下的两个数据结构进行
    IWindowSession负责ViewRootImpl到WMS单向请求
    IWindow用于WMS回调ViewRootImpl
    这两个数据结构都是标准的aidl接口,用于进程间同步通信
    在ViewRootImpl内部,存在着一个IWindowSession的静态成员和一个IWindow的非静态成员
    所以一个进程只有一个IWindowSession对象,但是可以有多个IWindow对象
    View的绘制就是在performTraversals()中启动的
Window
一个抽象类
PhoneWindow
  • 继承于Window,里面核心是mDecor,是一个顶层View
  • 窗口的添加就是通过调用getDecorView()获取到mDecorView并调用WindowManager addView()把View添加到WindowManager中的
    PhoneWindow通过getDecorView()对外提供获取mDecor
Activity
  • 应用程序初始化时,会首先生成一个activity对象,而这个activity对象没有属于自己的一个窗口,紧接着会调用attach()函数。
  • 在attach()函数里面该activity会调用PolicyManager.makeNewWindow()创建一个新的PhoneWindow。
  • 然后在activity的onCreate()生命周期里,一般会调用应用的setContentView()设置activity的显示界面
  • 在activity的setContentView()方法里面会执行如下:
  • getWindow().setContentView(layoutResID);
  • 初始化private DecorView mDecor; mDecor是DecorView对象,是FrameLayout的子类还有初始化private ViewGroup mContentParent这个变量mDecor就是我们的根View 根据theme中的属性值,选择合适的布局,通过infalter 放入到我们的mDecor中在这些布局中,一般会包含ActionBar,Title和一个id为content的FrameLayout最后,我们在activity中设置布局,会通过LayoutInflater inflater(我们的布局)包含到id为content的FrameLayout中
  • 因此,我们的操作主要是控制id为content的FrameLayout范围同时,mContentParent就是mDecor中id为content的View最后,当AMS准备resume一个activity时,会回调该activity的handlerResumeActivity方法该方法会调用activity的makeVisible(将其添加到WindowManager中)方法,显示我们刚才创建的mDecor视图Activity类中的mWindowManager(WindowManager对象)来自于Window类new的一个LocalWindowManager对象,其实
ActivityManager
负责一个新的Activity Thread创建

ActivityManagerProxy是ActivityManagerNative的内部类
ActivityManagerNative是一个抽象类,真正发挥作用的是其子类ActivityManagerService(系统Service组件)
使用ActivityManagerProxy来代理ActivityManagerNative的子类ActivityManagerService
ActivityManagerService的本地代理对象ActivityManagerProxy

ActivityManagerService
是一个Binder类,即可实现跨进程通信,运行于服务端
ProcessRecord记录每个进程里面的全部信息,主要信息是包括该进程中包含的Activity、Provider、Service等信息,进程文件信息,该进程的内存状态信息
HistoryRecord对象来管理和统计对应客户端Activity信息,该类是一个Binder类,可以跨进程调用
TaskRecord记录每个任务task信息,Activity可以运行在不同的Task中
ActivityThread
应用程序所对应的进程主线程类,即我们通常所说的UI线程
handleLauncheActivity、handleResumeActivity、handlePauseActivity、handleStopActivity、scheduleResumeActivity等方法都在这个类里面,
貌似Activity生命周期方法都在这个类里面调用
ApplicationThread
ActivityThread的内部类
该类是一个Binder类,即可实现跨进程通信,主要用于接受从AMS传递过来的信息,继而作相应的处理

H类
是一个Handler子类,该类仅仅是为了异步调用而设计,使用方式同handler一样

ActivityRecord
ActivityThread内部类
在客户端保存当前Activity的相关信息,方便ActivityThread管理维护Activity
客户端包含IBinder token属性,该token变量实际指向的ActivityManagerService的HistoryRecord对象

View

ViewRootImpl
本质上是一个Handler

Activity setContentView过程
首先初始化mDecor,即DecorView为FrameLayout子类,就是我们整个窗口的根视图了
然后,根据theme中的属性值,选择合适的布局,通过inflater放入到我们的mDecor中
在这些布局中,一般会包含ActionBar,Title和一个id为content的FrameLayout
最后,我们在Activity中设置的布局,会通过infalter压入到我们的id为content的FrameLayout中去

ServiceManager
Service在被使用之前,必须要向ServiceManager(简称SM)注册
同时客户端要访问某个Service时,应该首先向SM查询是否存在该服务
如果SM存在该这个Service,那么会将该Service的handler返回给client,handler是每个Service的唯一标识
当Service向SM注册时,该Service就是一个client,而SM则作为了Server。而某个进程需要与Service通信时,
此时这个进程为client,Service才作为Server,因此Service不一定为Server,有时它也作为client存在

应用和Service之前的通信会涉及到2次binder通信
    应用向SM查询Service是否存在,如果存在获得该Service的代理binder,此为一次binder通信
    应用通过代理binder调用Service的方法,此为二次binder通信
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值