当窗口的内容或者状态发生变化时,Surface Flinger就会在监听线程中监听到相关的事件,并进行处理。首先判断事件是不是控制台信号,如果是控制台信号,就调用handleConsoleEvents()方法进行控制台信号的处理,获取渲染的区域;当交易处理完成时,Surface Flinger会在handleTransaction()方法中遍历Z-order上的Layer,移去已经被销毁的Layer;接下来Surface Flinger会遍历LayerVector,计算每个Layer的可视区域,如果需要重绘,在handleRepaint()方法中会进行Layer组合,当组合完成后,会发送消息compositionComplete()通知硬件Layer组合已经完成,然后进行Surface的渲染。
        下面是Surface Flinger的监听线程处理事件的实现过程:
        代码:Surface Flinger的监听线程处理事件的实现过程
        bool SurfaceFlinger::threadLoop()
    {
        waitForEvent();    //超时时间为5s
        if (UNLIKELY(mConsoleSignals)) {
                handleConsoleEvents();
            }
        if (LIKELY(mTransactionCount==0)) {
            const uint32_t mask=eTransactionNeeded | eTraversalNeeded;
            uint32_t transactionFlags=getTransactionFlags(mask);
            if (LIKELY(transactionFlags)) {
                    handleTransaction(transactionFlags);
                }
        }
        handlePageFlip();
        const DisplayHardware& hw(graphicPlane(0).displayHardware());
        if (LIKELY(hw.canDraw() && !isFrozen())) {
                handleRepaint();	
	
                hw.compositionComplete();
                unlockClients();	    //客户端解锁
                postFramebuffer();    //前后端缓冲切换,显示
        } else {
                unlockClients();
                usleep(16667);
            }
        return true;
    }
        关于Surface,还有一个十分重要的概念就是layer_state_t,根据窗口状态的变化,Layer处于不同的状态。layer_state_t的值包括ePositionChanged、eLayerChanged、eSizeChanged、eAlphaChanged、eMatrixChanged、eTransparentRegionChanged、eVisibilityChanged等。当发生eLayerChanged变化时,说明缓冲需要切换。另外,不论layer_state_t值发生了何种变化,都需要重新遍历Layer,进行相应的重绘。
        一般而言,屏幕的渲染需要重绘Surface的所有像素,但是出于提高效率和速率的需要,在现代的设计上,会通过分析只重绘发生变化的区域。这部分的内容主要位于framebuffer.cpp的fb_post()函数中。在“LayerBuffer”和“LayerDim”模式的Layer中也有采用。
        在Surface上层,主要由窗口管理器来控制着窗口的变化。窗口管理器创建Surface的过程如图-1所示。
        流程说明:
        当Windows Manager要创建Surface时,首先会创建一个Java Surface对象,Java Surface对象通过Java JNI会获得一个SurfaceComposerClient句柄,然后通过SurfaceComposerClient向Surface Flinger请求创建一个原生层的C++ Surface对象和一个SurfaceControl对象。在Surface Flinger中,根据标志位(PUSH_BUFFERS、FX_SURFACE_NORMAL、FX_SURFACE_BLUR、FX_SURFACE_DIM)的不同,调用相应的方法创建相应类型的Layer。每个Surface都有一个唯一的标识符SurfaceID。
        为了执行窗口的操作,需要调用Surface.openTransaction()方法打开交易(Transaction)。在原生层,SurfaceFlinger会调用openGlobalTransaction()方法增加交易记数(mTransactionCount),并将交易ID保存在gActiveConnections向量中。
        Windows Manager通过调用Surface. setPosition()方法可以设置Surface的位置,当SurfaceComposerClient收到设置Surface位置的请求时,会将layer_state_t状态设为ISurfaceComposer::ePositionChanged,Surface Flinger在收到位置变化的消息后,会在其监听线程中进行处理。
        Windows Manager通过调用Surface. setLayer ()方法可以设置Surface的Layer,当SurfaceComposerClient收到设置Surface的Layer请求时,会将layer_state_t状态设为ISurfaceComposer::eLayerChanged,Surface Flinger在收到Layer变化的消息后,会在其监听线程中进行处理。
        
        图-1  Surface的创建过程
        如果希望隐藏已经创建的Surface,需要调用Surface.hide()来调用原生层的SurfaceComposerClient::hide()方法,SurfaceComposerClient会将其标志位和掩码均设为ISurfaceComposer::eLayerHidden,并向Surface Flinger发送ISurfaceComposer:: eVisibility Changed消息。
        当交易结束时,Windows Manager需要通过Surface.closeTransaction()方法通知原生层交易结束。
        需要说明的是,交易过程中的Java Surface对原生层C++ Surface的调用,是通过SurfaceControl对象来进行的。