윈도우와 활동의 관계에 대한 설명

복사 :  http://gityuan.com/2017/04/16/activity-with-window/

 

I. 개요

AMS는 직무 네 가지 핵심 구성 요소와 프로세스의 관리를 포함 가장 핵심 안드로이드 시스템 서비스 중 하나이며, 가장 활동의 네 가지 구성 요소의 복잡. 복잡성이 사용자 상호 작용 (창 포함)와 UI 위해서 필요한 것이 주된 책임 앱, SurfaceFlinger의 서로 서로 다른 모듈뿐만 아니라, 윈도우 관리 작업 사이 WMS이다. 한마디로 :

  • 앱 UI는 주로 특정 비즈니스 요구 사항입니다
  • AMS는 네 가지 구성 요소 및 프로세스 관리, 특히 활동 스택 및 기타 다양한 관리 상태 스위치의 관리 시스템입니다;
  • WMS는 Activiy 해당 윈도우 관리 시스템 (시스템 윈도우와 중첩 서브 - 윈도우)이고;
  • SurfaceFlinger의 프레임 버퍼 (프레임 버퍼)를 도면 UI에 도포하고, 마지막으로 스크린 하드웨어 렌더링 완료 흡입;

1.1 WMS 전체 그림

wms_relation

설명 :  클릭하면 확대

  • WMS는 상속 IWindowManager.Stub바인더 서버로;
  • WMS 부재 변수 mSessions 모든 세션 개체를 보유하고, 세션 상속 IWindowSession.Stub바인더 서버와;
  • 멤버 변수 mPolicy : 객체의 인스턴스를 윈도우와 관련된 다양한 전략을 구현하는 데 사용 PhoneWindowManager이다;
  • 멤버 변수 mChoreographer : 애니메이션 컨트롤 창, 화면 회전 및 기타 작업에 대한;
  • 멤버 변수 mDisplayContents : 기록 DisplayContent이 다 화면 출력과 연관된 객체 그룹;
  • 멤버 변수 mTokenMap : 모두 저장 WindowToken 객체를, IBinder이 핵심에, IAppWindowToken 또는 바인더의 다른 혈압 종료 될 수있다;
    • 사건의 다른 쪽 끝은 : ActivityRecord.Token는 IApplicationToken.Stub를 확장
  • 成员变量mWindowMap: 保存所有的WindowState对象;以IBinder为key, 是IWindow的Bp端;
    • 另一端情况: ViewRootImpl.W extends IWindow.Stub
  • 一般地,每一个窗口都对应一个WindowState对象, 该对象的成员变量mClient用于跟应用端交互,成员变量mToken用于跟AMS交互.

二. Activity与Window

2.1 Binder服务

wms_binder

上图是Window调用过程所涉及的Binder服务:

Binder服务端 接口 所在进程
WindowManagerService IWindowManager system_server
Session IWindowSession system_server
ViewRootImpl.W IWindow app进程
ActivityRecord.Token IApplicationToken system_server

Activity启动过程会执行组件的生命周期回调以及UI相关对象的创建。UI工作通过向AMS服务来 创建WindowState对象完成,该对象用于描述窗口各种状态属性,以及跟WMS通信。

  1. WindowManagerService: Activity通过其成员变量mWindowManager(数据类型WindowManagerImpl),再调用WindowManagerGlobal对象,经过binder call跟WMS通信;
  2. Session:ViewRootImp创建的用于跟WMS中的Session进行通信;
  3. ViewRootImpl.W:app端创建的binder服务;
  4. ActivityRecord.Token: startActivity过程通过binder call进入system_server进程,在该进程执行ASS.startActivityLocked()方法中会创建相应的ActivityRecord对象,该对象初始化时会创建数据类型为ActivityRecord.Token的成员变量appToken,然后会将该对象传递到ActivityThread.

2.2 核心对象

2.2.1 Activity对象

[-> Activity.java]

下面列举Activity对象的部分常见成员变量:

  1. mWindow:数据类型为PhoneWindow,继承于Window对象;
  2. mWindowManager:数据类型为WindowManagerImpl,实现WindowManager接口;
  3. mMainThread:数据类型为ActivityThread, 并非真正的线程,只是运行在主线程的对象。
  4. mUiThread: 数据类型为Thread,当前activity所在线程,即主线程;
  5. mHandler:数据类型为Handler, 当前主线程的handler;
  6. mDecor: 数据类型为View, Activity执行完resume之后创建的视图对象;

另外说明:WindowManagerImpl与Window这两个对象相互保存对方的信息:

  • WindowManagerImpl.mParentWindowWindow 指向Window对象;
  • Window.mWindowManager 指向WindowManagerImpl对象;

2.2.2 ViewRootImpl对象

  1. mWindowSession: 数据类型为IWindowSession, 同一进程中所有的ViewRootImpl对象只对应唯一相同的Session代理对象。
  2. mWindow: 数据类型为IWindow.Stub,每个创建对应一个该对象。

2.2.3 WindowState对象

WindowState对象代表一个窗口,记录在system_server.

  • mSession: 数据类型为Session,是system_server的binder服务端;
  • mClient: 数据类型为IWindow,是app端的ViewRootImpl.W服务的binder代理对象;

2.3 数量关系

  1. 每一个Activity对应一个应用窗口;每一个窗口对应一个ViewRootImpl对象;
  2. 每一个App进程对应唯一的WindowManagerGlobal对象;
    • WindowManagerGlobal.sWindowManagerService用于跟WMS交互
    • WindowManagerGlobal.sWindowSession用于跟Session交互;
  3. 每一个App进程对应唯一的相同Session代理对象;
  4. App可以没有Activity/PhoneWindow/DecorView,例如带悬浮窗口的Service;
  5. Activity运行在ActivityThread所在的主线程;
  6. DecorView是Activity所要显示的视图内容;
  7. ViewRootImpl:管理DecorView跟WMS的交互;每次调用addView()添加窗口时,则都会创建一个ViewRootImpl对象;

2.4 AMS与WMS的对于关系

Activity与Window有一些对象具有一定的对应关系:

AMS WMS
ActivityRecord AppWindowToken
TaskRecord Task
ActivityStack TaskStack

2.5 交互

  • App跟AMS通信,会建立Session连接到WMS,后续便通过IWindowSesson跟WMS通信;
  • WMS跟SF通信,WMS建立SurfaceComposerClient,然后会在SF中创建Client与之对应, 后续便通过ISurfaceComposerClient跟SF通信;

2.6 IWindow死亡回调

[-> WindowState.java]

private class DeathRecipient implements IBinder.DeathRecipient { public void binderDied() { try { synchronized(mService.mWindowMap) { WindowState win = mService.windowForClientLocked(mSession, mClient, false); Slog.i(TAG, "WIN DEATH: " + win); if (win != null) { mService.removeWindowLocked(win); } else if (mHasSurface) { Slog.e(TAG, "!!! LEAK !!! Window removed but surface still valid."); mService.removeWindowLocked(WindowState.this); } } } catch (IllegalArgumentException ex) { ... } } } 

프로세스 다이가 실행 IWindow 에이전트 system_server는 죽음 콜백을 받게됩니다 해당 창 정보의 제거를 처리하기 위해 앱 끝.

III. 요약

채팅은 주 스레드가 UI와 상호 작용하는 방법에 초점을 맞추었다.

계속하려면 ...

추천

출처www.cnblogs.com/Oude/p/12400977.html