日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android的窗口机制分析------ViewRoot类

發(fā)布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android的窗口机制分析------ViewRoot类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

ViewRoot是GUI管理系統(tǒng)與GUI呈現(xiàn)系統(tǒng)之間的橋梁,根據(jù)ViewRoot的定義,我們發(fā)現(xiàn)它并不是一個View類型,而是一個Handler。

它的主要作用如下:

A. 向DecorView分發(fā)收到的用戶發(fā)起的event事件,如按鍵,觸屏,軌跡球等事件;

B. 與WindowManagerService交互,完成整個Activity的GUI的繪制。


? ? 事件處理和GUI繪制的具體實現(xiàn)在后面的文章中再描述,這篇文章就主要介紹ViewRoot對象如何同WindowManagerService橋接起來的。? ??

? ? 在完成Activity的ContentView設(shè)置之后,下面的工作就是準(zhǔn)備顯示了,準(zhǔn)備顯示的主要工作就是建立起Application和WindowManagerService之間的聯(lián)系,第一步的工作就是向WindowManager添加前面涉及到的DecorView,我們已經(jīng)知道這個DecorView包含了整個Activity的GUI,所以我們只需要把這個DecorView交給WindowManager打理就可以了。

? ? 下面看看整個的過程 ? ?

A.?????向WindowManager添加DecorView;

handleResumeActivity@ActivityThread.java


[java]?view plaincopy
  • r.window?=?r.activity.getWindow();??
  • View?decor?=?r.window.getDecorView();??
  • decor.setVisibility(View.INVISIBLE);??
  • ViewManager?wm?=?a.getWindowManager();??
  • WindowManager.LayoutParams?l?=?r.window.getAttributes();??
  • a.mDecor?=?decor;??
  • l.type?=?WindowManager.LayoutParams.TYPE_BASE_APPLICATION;??
  • l.softInputMode?|=?forwardBit;??
  • if?(a.mVisibleFromClient)?{??
  • ????a.mWindowAdded?=?true;??
  • ????wm.addView(decor,?l);??
  • }??


  • B. WindowManagerImpl保存DecorView到mViews,創(chuàng)建對應(yīng)的ViewRoot;


    C.調(diào)用ViewRootsetView()方法


    這個方法中的主要工作就是建立起與WindowManagerService之間的聯(lián)系。

    [java]?view plaincopy
  • requestLayout();??
  • try?{??
  • ????res?=?sWindowSession.add(mWindow,?mWindowAttributes,??
  • ????????????getHostVisibility(),?mAttachInfo.mContentInsets);??
  • }?catch?(RemoteException?e)?{??

  • 在這個方法中只需要關(guān)注兩個步驟

    (1)???requestLayout()

    ? ? 請求WindowManagerService繪制GUI,但是注意一點的是它是在與WindowManagerService建立連接之前繪制,為什么要在建立之前請求繪制呢?

    ? ? 其實兩者實際的先后順序是正好相反的,與WMS建立連接在前,繪制GUI在后,那么為什么代碼的順序和執(zhí)行的順序不同呢?這里就涉及到ViewRoot的屬性了,我們前面提到ViewRoot并不是一個View,而是一個Handler,那么執(zhí)行的具體流程就是這樣的:

    a)???????ActivityThread的handler函數(shù)注冊了啟動一個新的Activity的請求處理LAUNCH_ACTIVITY,LAUNCH_ACTIVITY的處理過程調(diào)用到了ViewRoot的setView()方法,因此上圖代碼在被執(zhí)行時正處于LAUNCH_ACTIVITY消息的處理過程中。

    b)???????requestLayout()其實是向messagequeue發(fā)送了一個請求繪制GUI的消息,并且ViewRoot和ActivityThread共用同一個MessageQueue(如下圖),因此繪制GUI的過程一定是在LAUNCH_ACTIVITY消息被處理完之后,也就是sWindowSessoin.add()方法調(diào)用完之后。


    (2)???sWindowSessoin.add()

    從字面意思理解的話,IWindowSession sWindowSessoin是ViewRoot和WindowManagerService之間的一個會話層,它的實體是在WMS中定義,作為ViewRoot requests WMS的橋梁。

    add()方法的第一個參數(shù)mWindow是ViewRoot提供給WMS,以便WMS反向通知ViewRoot的接口。由于ViewRoot處在application端,而WMS處在system_server進程,它們處在不同的進程間,因此需要添加這個IWindow接口便于GUI繪制狀態(tài)的同步。


    原文地址:?http://blog.csdn.net/windskier/article/details/6957901

    總結(jié)

    以上是生活随笔為你收集整理的android的窗口机制分析------ViewRoot类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。