`
zzu_007
  • 浏览: 22512 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Activity与WindowManagerService连接的过程(三)

阅读更多
page11
    WindowManagerService的getDisplayContentLocked函数的定义如下:
    1     public DisplayContent getDisplayContentLocked(final int displayId) {
    2         DisplayContent displayContent = mDisplayContents.get(displayId);
    3         if (displayContent == null) {
    4             final Display display = mDisplayManager.getDisplay(displayId);
    5             if (display != null) {
    6                 displayContent = new DisplayContent(display);
    7                 mDisplayContents.put(displayId, displayContent);
    8             }
    9         }
    10         return displayContent;
    11     }
    getDisplayContentLocked函数的逻辑还是比较简单的.
page12
    在这篇文章里, 我们分析一下WindowState的创建过程.
    WindowState类的定义如下:
    final class WindowState implements WindowManagerPolicy.WindowState
    WindowState类的定义如下:
    1     WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token,
    2            WindowState attachedWindow, int seq, WindowManager.LayoutParams a,
    3            int viewVisibility, final DisplayContent displayContent) {
    4         mService = service;
    5         mSession = s;
    6         mClient = c;
    7         mToken = token;
    8         mOwnerUid = s.mUid;
    9         mAttrs.copyFrom(a);
    10         mViewVisibility = viewVisibility;
    11         mDisplayContent = displayContent;
    12         mPolicy = mService.mPolicy;
    13         mContext = mService.mContext;
    14         DeathRecipient deathRecipient = new DeathRecipient();
    15         mSeq = seq;
    16         mEnforceSizeCompat = (mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0;
    17         if (WindowManagerService.localLOGV) Slog.v(
    18             TAG, "Window " + this + " client=" + c.asBinder()
    19             + " token=" + token + " (" + mAttrs.token + ")" + " params=" + a);
    20         try {
    21             c.asBinder().linkToDeath(deathRecipient, 0);
    22         } catch (RemoteException e) {
    23             mDeathRecipient = null;
    24             mAttachedWindow = null;
    25             mLayoutAttached = false;
    26             mIsImWindow = false;
    27             mIsWallpaper = false;
    28             mIsFloatingLayer = false;
    29             mBaseLayer = 0;
    30             mSubLayer = 0;
    31             mInputWindowHandle = null;
    32             mWinAnimator = null;
    33             return;
    34         }
    35         mDeathRecipient = deathRecipient;
    36
    37         if ((mAttrs.type >= FIRST_SUB_WINDOW &&
    38                 mAttrs.type <= LAST_SUB_WINDOW)) {
    39             // The multiplier here is to reserve space for multiple
    40             // windows in the same type layer.
    41             mBaseLayer = mPolicy.windowTypeToLayerLw(
    42                     attachedWindow.mAttrs.type) * WindowManagerService.TYPE_LAYER_MULTIPLIER
    43                     + WindowManagerService.TYPE_LAYER_OFFSET;
    44             mSubLayer = mPolicy.subWindowTypeToLayerLw(a.type);
    45             mAttachedWindow = attachedWindow;
    46             if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + this + " to " + mAttachedWindow);
    47             mAttachedWindow.mChildWindows.add(this);
    48             mLayoutAttached = mAttrs.type !=
    49                     WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
    50             mIsImWindow = attachedWindow.mAttrs.type == TYPE_INPUT_METHOD
    51                     || attachedWindow.mAttrs.type == TYPE_INPUT_METHOD_DIALOG;
    52             mIsWallpaper = attachedWindow.mAttrs.type == TYPE_WALLPAPER;
    53             mIsFloatingLayer = mIsImWindow || mIsWallpaper;
    54         } else {
    55             // The multiplier here is to reserve space for multiple
    56             // windows in the same type layer.
    57             mBaseLayer = mPolicy.windowTypeToLayerLw(a.type)
    58                     * WindowManagerService.TYPE_LAYER_MULTIPLIER
    59                     + WindowManagerService.TYPE_LAYER_OFFSET;
    60             mSubLayer = 0;
    61             mAttachedWindow = null;
    62             mLayoutAttached = false;
    63             mIsImWindow = mAttrs.type == TYPE_INPUT_METHOD
    64                     || mAttrs.type == TYPE_INPUT_METHOD_DIALOG;
    65             mIsWallpaper = mAttrs.type == TYPE_WALLPAPER;
    66             mIsFloatingLayer = mIsImWindow || mIsWallpaper;
    67         }
    68
    69         WindowState appWin = this;
    70         while (appWin.mAttachedWindow != null) {
    71             appWin = appWin.mAttachedWindow;
    72         }
    73         WindowToken appToken = appWin.mToken;
    74         while (appToken.appWindowToken == null) {
    75             WindowToken parent = mService.mTokenMap.get(appToken.token);
    76             if (parent == null || appToken == parent) {
    77                 break;
    78             }
    79             appToken = parent;
    80         }
    81         mRootToken = appToken;
    82         mAppToken = appToken.appWindowToken;
    83
    84         mWinAnimator = new WindowStateAnimator(this);
    85         mWinAnimator.mAlpha = a.alpha;
    86
    87         mRequestedWidth = 0;
    88         mRequestedHeight = 0;
    89         mLastRequestedWidth = 0;
    90         mLastRequestedHeight = 0;
    91         mXOffset = 0;
    92         mYOffset = 0;
    93         mLayer = 0;
    94         mInputWindowHandle = new InputWindowHandle(
    95                 mAppToken != null ? mAppToken.mInputApplicationHandle : null, this,
    96                 displayContent.getDisplayId());
    97     }
    第6行(WindowState->WindowState)会将IWindow接口保存到成员变量mClient中去.
page13
WindowState的attach函数的定义如下:
1     void attach() {
2         if (WindowManagerService.localLOGV) Slog.v(
3             TAG, "Attaching " + this + " token=" + mToken
4             + ", list=" + mToken.windows);
5         mSession.windowAddedLocked();
6     }
第5行(WindowState->attach)会调用Session的windowAddedLocked函数, 关于Session的windowAddedLocked函数的详细分析可以参考page14文件.
page14
这里我们分析一下Session的windowAddedLocked函数的实现, Session的windowAddedLocked函数的定义如下:
1     void windowAddedLocked() {
    2         if (mSurfaceSession == null) {
    3             if (WindowManagerService.localLOGV) Slog.v(
    4                 WindowManagerService.TAG, "First window added to " + this + ", creating SurfaceSession");
    5             mSurfaceSession = new SurfaceSession();
    6             if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
    7                     WindowManagerService.TAG, "  NEW SURFACE SESSION " + mSurfaceSession);
    8             mService.mSessions.add(this);
    9         }
    10         mNumWindow++;
    11     }
    第2行(Session->windowAddedLocked)判断是否已经创建过SurfaceSession, 如果是就不用在创建了. 由此可知, 每一个Activity都对应有一个SurfaceSession对象.
    第5行(Session->windowAddedLocked)会创建一个SurfaceSession对象, 关于SurfaceSession对象的创建过程可以参考page15文件.
    第8行(Session->windowAddedLocked)会将本Session加入到mService.mSessions中去, mService.mSessions的定义如下:
    final HashSet<Session> mSessions = new HashSet<Session>();
    mSessions保存着当前活跃的连接
    最后, 第10行(Session->windowAddedLocked)会将window的数量加1.
page15
这里我们关注一下SurfaceSession对象的创建, SurfaceSession类的构造函数的定义如下:
1 public SurfaceSession() {
2 mNativeClient = nativeCreate();
3 }
第2行(SurfaceSession->SurfaceSession)会调用nativeCreate函数, nativeCreate函数的定义如下:
private static native int nativeCreate();
这是个native函数, 最终会调用android_view_surfaceSession.cpp中的nativeCreate函数, android_view_surfaceSession.cpp中的nativeCreate函数的定义如下:
1 static jint nativeCreate(JNIEnv* env, jclass clazz) {
2     SurfaceComposerClient* client = new SurfaceComposerClient();
3     client->incStrong(clazz);
4     return reinterpret_cast<jint>(client);
5 }
我靠, 我靠, 我靠!看到了吧, 第三行(android_view_surfaceSession.cpp::nativeCreate)会创建一个SurfaceComposerClient, 是不是很熟悉.


分享到:
评论

相关推荐

    WindowManagerService详解图

    WindowManagerService详解图

    animations in WindowManagerService翻译的结果

    animations in WindowManagerService翻译的结果

    WindowManagerService相关类图.eddx

    Activity,Window,DecorView,ViewRootImpl,WindowManager,WindowManagerImpl,WindowManagerGlobal,WindowManagerService相关类图

    深入理解WindowManagerService笔记

    深入理解WindowManagerService笔记

    WindowManagerService服务是如何以堆栈的形式来组织窗口

    与Activity类似,Android系统中的窗口也是以堆栈的形式组织在WindowManagerService服务中的,其中,Z轴位置较低的窗口位于Z轴位置较高的窗口的下面。在本文中,我们就详细分析WindowManagerService服务是如何以堆栈...

    android4.0按键处理

    有关4.0按键的处理流程,包括windowmanagerservice的激动启动等

    Android应用程序UI架构 高清PTT

    Android系统采用一种称为Surface的UI架构为应用程序提供用户...这个PPT讲Android应用程序的Surface机制,阐述Activity、Window和View的关系,以及应用程序、WindowManagerService和SurfaceFlinger协作完成UI渲染的过程

    Android窗口机制

    DecorView通过PhoneWindow与WindowManagerService通信原理图 每个Activity都有一个Window对象,这个对象是PhoneWindow类型的。 每个Window对象里面都维护着一个WindowManager对象。 Activity里面添加一个View是通过...

    Android应用内悬浮窗的实现方案示例

    悬浮窗,大家应该也不陌生,凌驾于应用之上的一个小弹窗,实现上很简单,就是添加一个系统级别的窗口,Android中通过WindowManagerService( WMS)来管理所有的窗口,对于WMS来说,管你是Activity、Toast、Dialog,...

    Android应用程序进程管理

    这个PPT讲Android应用程序进程的启动和回收,主要涉及到Zygote进程、System Server进程,以及组件管理服务ActivityManagerService、窗口服务WindowManagerService,还有专用驱动Low Memory Killer。通过了解Android...

    Android input系统.pdf

     WindowManagerService.java : 作为应用与IMS的通信桥梁, 也作为InputDispatcher向AMS报告ANR的通信桥梁.  ActivityManagerService.java :ANR 处理.  Activity & Views :接收输入事件并处理.

    深入理解Android中的Window和WindowManager

    创建一个Window,需要通过WindowManager即可完成,WindowManager是外界访问Window的入口,Window具体实现位于WindowManagerService中,WindowManager和WindowManagerService的交互是一个IPC的过程。Android中,所有...

    Android 添加系统服务的方法详解

    系统服务是Android中非常重要的一部分, 像ActivityManagerService, PackageManagerService, WindowManagerService, 这些系统服务都是Framework层的关键服务, 本篇文章主要讲一下如何基于Android源码添加一个系统服务...

    liuying1992#open-source-project#01Android窗口管理框架:Android窗口管理框架概述1

    从上图可以看出,Android的显示系统分为3层:UI框架层:负责管理窗口中View组件的布局与绘制以及响应用户输入事件WindowManagerService

    Android-Event-driver.zip_Looper_android_android Handler_event

    Android 事件捕捉和处理流程分析 ,在Android系统中,键盘按键事件是由WindowManagerService服务来管理的,然后再以消息的形式来分发给应用程序处理,不过和普通消息不一样,它是由硬件中断触发的;在上一篇文章...

    Android控件TextView的实现原理分析

    Android控件TextView的实现...实际上,每一个视图都是一个控件,这些控制可以将自己的UI绘制在窗口的绘图表面上,同时还可以与用户进行交互,即获得用户的键盘或者触摸屏输入。在本文中,我们就详细分析窗口控件的上

Global site tag (gtag.js) - Google Analytics