日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android应用程序窗口(Activity)的视图对象(View)的创建过程分析

發布時間:2025/4/5 Android 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android应用程序窗口(Activity)的视图对象(View)的创建过程分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章轉載至CSDN社區羅升陽的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8245546

從前文可知道,每一個Activity組件都有一個關聯的Window對象,用來描述一個應用程序窗口。每一個應用程序窗口內部又包含有一個View對象,用來描述應用程序窗口的視圖。應用程序窗口視圖是真正用來實現UI內容和布局的,也就是說,每一個Activity組件的UI內容和布局都是通過與其所關聯的一個Window對象的內部的一個View對象來實現的。在本文中,我們就詳細分析應用程序窗口視圖的創建過程。

?? ? ? 在前面Android應用程序窗口(Activity)實現框架簡要介紹和學習計劃一文中提到,應用程序窗口內部所包含的視圖對象的實際類型為DecorView。DecorView類繼承了View類,是作為容器(ViewGroup)來使用的,它的實現如圖1所示:


圖1 DecorView類的實現

?? ? ? ?這個圖的具體描述可以參考Android應用程序窗口(Activity)實現框架簡要介紹和學習計劃一文中的圖5,這里不再詳述。

?? ? ? ?從前面Android應用程序窗口(Activity)實現框架簡要介紹和學習計劃一文還可以知道,每一個應用程序窗口的視圖對象都有一個關聯的ViewRoot對象,這些關聯關系是由窗口管理器來維護的,如圖2所示:


圖2 應用程序窗口視圖與ViewRoot的關系圖

?? ? ? ?這個圖的具體描述可以參考Android應用程序窗口(Activity)實現框架簡要介紹和學習計劃一文中的圖6,這里不再詳述。

?? ? ? ?簡單來說,ViewRoot相當于是MVC模型中的Controller,它有以下職責:

?? ? ? ?1. 負責為應用程序窗口視圖創建Surface。

?? ? ? ?2. 配合WindowManagerService來管理系統的應用程序窗口。

?? ? ? ?3. 負責管理、布局和渲染應用程序窗口視圖的UI。

?? ? ? ?那么,應用程序窗口的視圖對象及其所關聯的ViewRoot對象是什么時候開始創建的呢? 從前面Android應用程序窗口(Activity)的窗口對象(Window)的創建過程分析一 文可以知道,Activity組件在啟動的時候,系統會為它創建窗口對象(Window),同時,系統也會為這個窗口對象創建視圖對象。另一方面,當 Activity組件被激活的時候,系統如果發現與它的應用程序窗口視圖對象所關聯的ViewRoot對象還沒有創建,那么就會先創建這個 ViewRoot對象,以便接下來可以將它的UI渲染出來。

?? ? ? 從前面Android應用程序啟動過程源代碼分析一 文可以知道,Activity組件在啟動的過程中,會調用ActivityThread類的成員函數handleLaunchActivity,用來創建 以及首次激活Activity組件,因此,接下來我們就從這個函數開始,具體分析應用程序窗口的視圖對象及其所關聯的ViewRoot對象的創建過程,如 圖3所示:


圖3 應用程序窗口視圖的創建過程

?? ? ? ?這個過程一共可以分為13個步驟,接下來我們就詳細分析每一個步驟。

?? ? ? ?Step 1. ActivityThread.handleLaunchActivity

?

[java] view plaincopy
  • public?final?class?ActivityThread?{??
  • ????......??
  • ??
  • ????private?final?void?handleLaunchActivity(ActivityClientRecord?r,?Intent?customIntent)?{??
  • ????????......??
  • ??
  • ????????Activity?a?=?performLaunchActivity(r,?customIntent);??
  • ??
  • ????????if?(a?!=?null)?{??
  • ????????????......??
  • ??
  • ????????????handleResumeActivity(r.token,?false,?r.isForward);??
  • ??
  • ????????????......??
  • ????????}??
  • ??
  • ????????......??
  • ????}??
  • ??
  • ????......??
  • }??
  • ?? ? ? ?這個函數定義在文件frameworks/base/core/java/android/app/ActivityThread.java文件中。

    ?? ? ? ?函數首先調用ActivityThread類的成員函數performLaunchActivity來創建要啟動的Activity組件。在創建 Activity組件的過程中,還會為該Activity組件創建窗口對象和視圖對象。Activity組件創建完成之后,就可以將它激活起來了,這是通 過調用ActivityThread類的成員函數handleResumeActivity來執行的。

    ?? ? ? ?接下來,我們首先分析ActivityThread類的成員函數performLaunchActivity的實現,以便可以了解應用程序窗口視圖對象 的創建過程,接著再回過頭來繼續分析ActivityThread類的成員函數handleResumeActivity的實現,以便可以了解與應用程序 窗口視圖對象所關聯的ViewRoot對象的創建過程。

    ?? ? ? ?Step 2.?ActivityThread.performLaunchActivity

    ?? ? ? ?這個函數定義在文件frameworks/base/core/java/android/app/ActivityThread.java文件中。

    ?? ? ? ?這一步可以參考Android應用程序窗口(Activity)的運行上下文環境(Context)的創建過程分析一文的Step 1,它主要就是創建一個Activity組件實例,并且調用這個Activity組件實例的成員函數onCreate來讓其執行一些自定義的初始化工作。

    ?? ? ? ?Step 3.?Activity.onCreate

    ?? ? ? ?這個函數定義在文件frameworks/base/core/java/android/app/Activity.java中。

    ?? ? ? ?這一步可以參考Android應用程序窗口(Activity)的運行上下文環境(Context)的創建過程分析一文的Step 10。我們在實現一個Activity組件的時候,也就是在實現一個Activity子類的時候,一般都會重寫成員函數onCreate,以便可以執行一些自定義的初始化工作,其中就包含初始化UI的工作。例如,在前面在Ubuntu上為Android系統內置Java應用程序測試Application Frameworks層的硬件服務一文中,我們實現了一個名稱為Hello的Activity組件,用來測試硬件服務,它的成員函數onCreate的樣子長得大概如下所示:

    ?

    [java] view plaincopy
  • public?class?Hello?extends?Activity?implements?OnClickListener?{????
  • ????......????
  • ????????
  • ????/**?Called?when?the?activity?is?first?created.?*/????
  • ????@Override????
  • ????public?void?onCreate(Bundle?savedInstanceState)?{????
  • ????????super.onCreate(savedInstanceState);????
  • ????????setContentView(R.layout.main);????
  • ????
  • ????????......????
  • ????}????
  • ??
  • ????......??
  • }??
  • ?? ? ? 其中,調用從父類Activity繼承下來的成員函數setContentView就是用來創建應用程序窗口視圖對象的。

    ?? ? ? 接下來,我們就繼續分析Activity類的成員函數setContentView的實現。

    ?? ? ? Step 4.?Activity.setContentView

    ?

    [java] view plaincopy
  • public?class?Activity?extends?ContextThemeWrapper??
  • ????????implements?LayoutInflater.Factory,??
  • ????????Window.Callback,?KeyEvent.Callback,??
  • ????????OnCreateContextMenuListener,?ComponentCallbacks?{??
  • ????......??
  • ??
  • ????private?Window?mWindow;??
  • ????......??
  • ??
  • ????public?Window?getWindow()?{??
  • ????????return?mWindow;??
  • ????}??
  • ????......??
  • ??
  • ????public?void?setContentView(int?layoutResID)?{??
  • ????????getWindow().setContentView(layoutResID);??
  • ????}??
  • ??
  • ????......??
  • }??
  • ?? ? ? ?這個函數定義在文件frameworks/base/core/java/android/app/Activity.java中。

    ?? ? ? ?Activity類的成員函數setContentView首先調用另外一個成員函數getWindow來獲得成員變量mWindow所描述的一個窗口 對象,接著再調用這個窗口對象的成員函數setContentView來執行創建應用程序窗口視圖對象的工作。

    ?? ? ? ?從前面Android應用程序窗口(Activity)的窗口對象(Window)的創建過程分析一文可以知道,Activity類的成員變量mWindow指向的是一個PhoneWindow對象,因此,接下來我們就繼續分析PhoneWindow類的成員函數setContentView的實現。

    ?? ? ? ?Step 5. PhoneWindow.setContentView

    ?

    [java] view plaincopy
  • public?class?PhoneWindow?extends?Window?implements?MenuBuilder.Callback?{??
  • ????......??
  • ??
  • ????//?This?is?the?view?in?which?the?window?contents?are?placed.?It?is?either??
  • ????//?mDecor?itself,?or?a?child?of?mDecor?where?the?contents?go.??
  • ????private?ViewGroup?mContentParent;??
  • ????......??
  • ??
  • ????@Override??
  • ????public?void?setContentView(int?layoutResID)?{??
  • ????????if?(mContentParent?==?null)?{??
  • ????????????installDecor();??
  • ????????}?else?{??
  • ????????????mContentParent.removeAllViews();??
  • ????????}??
  • ????????mLayoutInflater.inflate(layoutResID,?mContentParent);??
  • ????????final?Callback?cb?=?getCallback();??
  • ????????if?(cb?!=?null)?{??
  • ????????????cb.onContentChanged();??
  • ????????}??
  • ????}??
  • ??
  • ????......??
  • }??
  • ?? ? ? ?這個函數定義在文件frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindow.java中。

    ?? ? ? ?PhoneWindow類的成員變量mContentParent用來描述一個類型為DecorView的視圖對象,或者這個類型為DecorView 的視圖對象的一個子視圖對象,用作UI容器。當它的值等于null的時候,就說明正在處理的應用程序窗口的視圖對象還沒有創建。在這種情況下,就會調用成 員函數installDecor來創建應用程序窗口視圖對象。否則的話,就說明是要重新設置應用程序窗口的視圖。在重新設置之前,首先調用成員變量 mContentParent所描述的一個ViewGroup對象來移除原來的UI內空。

    ?? ? ? ?由于我們是在Activity組件啟動的過程中創建應用程序窗口視圖的,因此,我們就假設此時PhoneWindow類的成員變量 mContentParent的值等于null。接下來,函數就會調用成員函數installDecor來創建應用程序窗口視圖對象,接著再通過調用 PhoneWindow類的成員變量mLayoutInflater所描述的一個LayoutInflater對象的成員函數inflate來將參數 layoutResID所描述的一個UI布局設置到前面所創建的應用程序窗口視圖中去,最后還會調用一個Callback接口的成員函數 onContentChanged來通知對應的Activity組件,它的視圖內容發生改變了。從前面Android應用程序窗口(Activity)的窗口對象(Window)的創建過程分析一文可以知道,Activity組件自己實現了這個Callback接口,并且將這個Callback接口設置到了與它所關聯的應用程序窗口對象的內部去,因此,前面實際調用的是Activity類的成員函數onContentChanged來發出一個視圖內容變化通知。

    ?? ? ?接下來,我們就繼續分析PhoneWindow類的成員函數installDecor的實現,以便可以繼續了解應用程序窗口視圖對象的創建過程。

    ?? ? ?Step 6.?PhoneWindow.installDecor

    ?

    [java] view plaincopy
  • public?class?PhoneWindow?extends?Window?implements?MenuBuilder.Callback?{??
  • ????......??
  • ??
  • ????//?This?is?the?top-level?view?of?the?window,?containing?the?window?decor.??
  • ????private?DecorView?mDecor;??
  • ????......??
  • ??
  • ????//?This?is?the?view?in?which?the?window?contents?are?placed.?It?is?either??
  • ????//?mDecor?itself,?or?a?child?of?mDecor?where?the?contents?go.??
  • ????private?ViewGroup?mContentParent;??
  • ????......??
  • ??
  • ????private?TextView?mTitleView;??
  • ????......??
  • ??
  • ????private?CharSequence?mTitle?=?null;??
  • ????......??
  • ??
  • ????private?void?installDecor()?{??
  • ????????if?(mDecor?==?null)?{??
  • ????????????mDecor?=?generateDecor();??
  • ????????????......??
  • ????????}??
  • ????????if?(mContentParent?==?null)?{??
  • ????????????mContentParent?=?generateLayout(mDecor);??
  • ??
  • ????????????mTitleView?=?(TextView)findViewById(com.android.internal.R.id.title);??
  • ????????????if?(mTitleView?!=?null)?{??
  • ????????????????if?((getLocalFeatures()?&?(1?<<?FEATURE_NO_TITLE))?!=?0)?{??
  • ????????????????????View?titleContainer?=?findViewById(com.android.internal.R.id.title_container);??
  • ????????????????????if?(titleContainer?!=?null)?{??
  • ????????????????????????titleContainer.setVisibility(View.GONE);??
  • ????????????????????}?else?{??
  • ????????????????????????mTitleView.setVisibility(View.GONE);??
  • ????????????????????}??
  • ????????????????????if?(mContentParent?instanceof?FrameLayout)?{??
  • ????????????????????????((FrameLayout)mContentParent).setForeground(null);??
  • ????????????????????}??
  • ????????????????}?else?{??
  • ????????????????????mTitleView.setText(mTitle);??
  • ????????????????}??
  • ????????????}??
  • ????????}??
  • ????}??
  • ??
  • ????......??
  • }??
  • ?? ? ? ?這個函數定義在文件frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindow.java中。

    ?? ? ? ?由于我們是在Activity組件啟動的過程中創建應用程序窗口視圖的,因此,我們同時假設此時PhoneWindow類的成員變量mDecor的值等 于null。這時候PhoneWindow類的成員函數installDecor就會調用另外一個成員函數generateDecor來創建一個 DecorView對象,并且保存在PhoneWindow類的成員變量mDecor中。

    ?? ? ? ?PhoneWindow類的成員函數installDecor接著再調用另外一個成員函數generateLayout來根據當前應用程序窗口的 Feature來加載對應的窗口布局文件。這些布局文件保存在frameworks/base/core/res/res/layout目錄下,它們必須 包含有一個id值為“content”的布局控件。這個布局控件必須要從ViewGroup類繼承下來,用來作為窗口的UI容器。PhoneWindow 類的成員函數generateLayout執行完成之后,就會這個id值為“content”的ViewGroup控件來給PhoneWindow類的成 員函數installDecor,后者再將其保存在成員變量mContentParent中。

    ?? ? ? PhoneWindow類的成員函數installDecor還會檢查前面加載的窗口布局文件是否包含有一個id值為“title”的TextView控 件。如果包含有的話,就會將它保存在PhoneWindow類的成員變量mTitleView中,用來描述當前應用程序窗口的標題欄。但是,如果當前應用 程序窗口是沒有標題欄的,即它的Feature位FEATURE_NO_TITLE的值等于1,那么PhoneWindow類的成員函數 installDecor就需要將前面得到的標題欄隱藏起來。注意,PhoneWindow類的成員變量mTitleView所描述的標題欄有可能是包含 在一個id值為“title_container”的容器里面的,在這種情況下,就需要隱藏該標題欄容器。另一方面,如果當前應用程序窗口是設置有標題欄 的,那么PhoneWindow類的成員函數installDecor就會設置它的標題欄文字。應用程序窗口的標題欄文字保存在PhoneWindow類 的成員變量mTitle中,我們可以調用PhoneWindow類的成員函數setTitle來設置。

    ?? ? ? 這一步執行完成之后,應用程序窗口視圖就創建完成了,回到前面的Step 1中,即ActivityThread類的成員函數handleLaunchActivity中,接下來就會調用ActivityThread類的另外一 個成員函數handleResumeActivity來激活正在啟動的Activity組件。由于在是第一次激活該Activity組件,因此,在激活之 前,還會為該Activity組件創建一個ViewRoot對象,并且與前面所創建的應用程序窗口視圖關聯起來,以便后面可以通過該ViewRoot對象 來控制應用程序窗口視圖的UI展現。

    ?? ? ? 接下來,我們就繼續分析ActivityThread類的成員函數handleResumeActivity的實現。

    ?? ? ? Step 7.?ActivityThread.handleResumeActivity

    ?

    [java] view plaincopy
  • public?final?class?ActivityThread?{??
  • ????......??
  • ??
  • ????final?void?handleResumeActivity(IBinder?token,?boolean?clearHide,?boolean?isForward)?{??
  • ????????......??
  • ??
  • ????????ActivityClientRecord?r?=?performResumeActivity(token,?clearHide);??
  • ??
  • ????????if?(r?!=?null)?{??
  • ????????????final?Activity?a?=?r.activity;??
  • ????????????......??
  • ??
  • ????????????//?If?the?window?hasn't?yet?been?added?to?the?window?manager,??
  • ????????????//?and?this?guy?didn't?finish?itself?or?start?another?activity,??
  • ????????????//?then?go?ahead?and?add?the?window.??
  • ????????????boolean?willBeVisible?=?!a.mStartedActivity;??
  • ????????????if?(!willBeVisible)?{??
  • ????????????????try?{??
  • ????????????????????willBeVisible?=?ActivityManagerNative.getDefault().willActivityBeVisible(??
  • ????????????????????????????a.getActivityToken());??
  • ????????????????}?catch?(RemoteException?e)?{??
  • ????????????????}??
  • ????????????}??
  • ????????????if?(r.window?==?null?&&?!a.mFinished?&&?willBeVisible)?{??
  • ????????????????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;??
  • ????????????????......??
  • ????????????????if?(a.mVisibleFromClient)?{??
  • ????????????????????a.mWindowAdded?=?true;??
  • ????????????????????wm.addView(decor,?l);??
  • ????????????????}??
  • ????????????}???
  • ??
  • ????????????......??
  • ????????}??
  • ??
  • ????????......??
  • ????}??
  • ????
  • ????......??
  • }??
  • ?? ? ? ?這個函數定義在文件frameworks/base/core/java/android/app/ActivityThread.java中。

    ?? ? ? ?ActivityThread類的成員函數handleResumeActivity首先調用另外一個成員函數 performResumeActivity來通知Activity組件,它要被激活了,即會導致Activity組件的成員函數onResume被調 用。ActivityThread類的成員函數performResumeActivity的返回值是一個ActivityClientRecord對象 r,這個ActivityClientRecord對象的成員變量activity描述的就是正在激活的Activity組件a。

    ?? ? ? ?ActivityThread類的成員函數handleResumeActivity接下來判斷正在激活的Activity組件接下來是否是可見的。如 果是可見的,那么變量willBeVisible的值就會等于true。Activity類的成員變量mStartedActivity用來描述一個 Activity組件是否正在啟動一個新的Activity組件,并且等待這個新的Activity組件的執行結果。如果是的話,那么這個 Activity組件的成員變量mStartedActivity的值就會等于true,表示在新的Activity組件的執行結果返回來之前,當前 Activity組件要保持不可見的狀態。因此,當Activity組件a的成員變量mStartedActivity的值等于true的時候,它接下來 就是不可見的,否則的話,就是可見的。

    ?? ? ? ?雖然說在Activity組件a的成員變量mStartedActivity的值等于true的情況下,它接下來的狀態要保持不可見的,但是有可能它所 啟動的Activity組件的UI不是全屏的。在這種情況下,Activity組件a的UI仍然是有部分可見的,這時候也要將變量 willBeVisible的值設置為true。因此,如果前面得到變量willBeVisible的值等于false,那么 ActivityThread類的成員函數handleResumeActivity接下來就會通過Binder進程間通信機制來調用 ActivityManagerService服務的成員函數willActivityBeVisible來檢查位于Activity組件a上面的其它 Activity組件(包含了Activity組件a正在等待其執行結果的Activity組件)是否是全屏的。如果不是,那么 ActivityManagerService服務的成員函數willActivityBeVisible的返回值就會等于true,表示接下來需要顯示 Activity組件a。

    ?? ? ? 前面得到的ActivityClientRecord對象r的成員變量window用來描述當前正在激活的Activity組件a所關聯的應用程序窗口對 象。當它的值等于null的時候,就表示當前正在激活的Activity組件a所關聯的應用程序窗口對象還沒有關聯一個ViewRoot對象。進一步地, 如果這個正在激活的Activity組件a還活著,并且接下來是可見的,即ActivityClientRecord對象r的成員變量mFinished 的值等于false,并且前面得到的變量willBeVisible的值等于true,那么這時候就說明需要為與Activity組件a所關聯的一個應用 程序窗口視圖對象關聯的一個ViewRoot對象。

    ?? ? ? 將一個Activity組件的應用程序窗口視圖對象與一個ViewRoot對象關聯是通過該Activity組件所使用的窗口管理器來執行的。從前面Android應用程序窗口(Activity)的窗口對象(Window)的創建過程分析一 文可以知道,一個Activity組件所使用的本地窗口管理器保存它的成員變量mWindowManager中,這可以通過Activity類的成員函數 getWindowManager來獲得。在接下來的Step 10中,我們再分析Activity類的成員函數getWindowManager的實現。

    ?? ? ? 由于我們現在要給Activity組件a的應用程序窗口視圖對象關聯一個ViewRoot對象,因此,我們就需要首先獲得這個應用程序窗口視圖對象。從前 面的Step 6可以知道,一個Activity組件的應用程序窗口視圖對象保存在與其所關聯的一個應用程序窗口對象的內部,因此,我們又要首先獲得這個應用程序窗口對 象。與一個Activity組件所關聯的應用程序窗口對象可以通過調用該Activity組件的成員函數getWindow來獲得。一旦獲得了這個應用程 序窗口對象(類型為PhoneWindow)之后,我們就可以調用它的成員函數getDecorView來獲得它內部的視圖對象。在接下來的Step 8和Step 9中,我們再分別分析Activity類的成員函數Activity類的成員函數getWindow和PhoneWindow類的成員函數 getDecorView的實現。

    ?? ? ?在關聯應用程序窗口視圖對象和ViewRoot對象的時候,還需要第三個參數,即應用程序窗口的布局參數,這是一個類型為 WindowManager.LayoutParams的對象,可以通過調用應用程序窗口的成員函數getAttributes來獲得。一切準備就緒之 后,還要判斷最后一個條件是否成立,即當前正在激活的Activity組件a在本地進程中是否是可見的,即它的成員變量 mVisibleFromClient的值是否等于true。如果是可見的,那么最后就可以調用前面所獲得的一個本地窗口管理器wm(類型為 LocalWindowManager)的成員函數addView來執行關聯應用程序窗口視圖對象和ViewRoot對象的操作。

    ?? ? 接下來,我們就分別分析Activity類的成員函數getWindow、PhoneWindow類的成員函數getDecorView、ctivity 類的成員函數getWindowManager以及LocalWindowManager類的成員函數addView的實現。

    ?? ? Step 8.?Activity.getWindow

    [java] view plaincopy
  • public?class?Activity?extends?ContextThemeWrapper??
  • ????????implements?LayoutInflater.Factory,??
  • ????????Window.Callback,?KeyEvent.Callback,??
  • ????????OnCreateContextMenuListener,?ComponentCallbacks?{??
  • ????......??
  • ??
  • ????private?Window?mWindow;??
  • ????......??
  • ??
  • ????public?Window?getWindow()?{??
  • ????????return?mWindow;??
  • ????}??
  • ??
  • ????......??
  • }??
  • ?? ? ? ?這個函數定義在文件frameworks/base/core/java/android/app/Activity.java中。

    ?? ? ? ?從前面Android應用程序窗口(Activity)的窗口對象(Window)的創建過程分析一文可以知道,Activity類的成員變量mWindow指向的是一個類型為PhoneWindow的窗口對象,因此,Activity類的成員函數getWindow返回給調用者的是一個PhoneWindow對象。

    ?? ? ? ?這一步執完成之后,返回到前面的Step 7中,即ActivityThread類的成員函數handleResumeActivity中,接下來就會繼續調用前面所獲得的一個 PhoneWindow對象的成員函數getDecorView來獲得當前正在激活的Activity組件所關聯的一個應用程序窗口視圖對象。

    ?? ? ? ?Step 9.?PhoneWindow.getDecorView

    [java] view plaincopy
  • public?class?PhoneWindow?extends?Window?implements?MenuBuilder.Callback?{??
  • ????......??
  • ??
  • ????private?DecorView?mDecor;??
  • ????......??
  • ??
  • ????@Override??
  • ????public?final?View?getDecorView()?{??
  • ????????if?(mDecor?==?null)?{??
  • ????????????installDecor();??
  • ????????}??
  • ????????return?mDecor;??
  • ????}??
  • ??
  • ????......??
  • }??
  • ?? ? ? ?這個函數定義在文件frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindow.java中。

    ?? ? ? ?PhoneWindow類的成員函數getDecorView首先判斷成員變量mDecor的值是否等于null。如果是的話,那么就說明當前正在處理 的應用程序窗口還沒有創建視圖對象。這時候就會調用另外一個成員函數installDecor來創建這個視圖對象。從前面的調用過程可以知道,當前正在處 理的應用程序窗口已經創建過視圖對象,因此,這里的成員變量mDecor的值不等于null,PhoneWindow類的成員函數 getDecorView直接將它返回給調用者。

    ?? ? ? ?這一步執完成之后,返回到前面的Step 7中,即ActivityThread類的成員函數handleResumeActivity中,接下來就會繼續調用當前正在激活的Activity組件 的成員函數getWindowManager來獲得一個本地窗口管理器。

    ?? ? ? ?Step 10.?Activity.getWindowManager

    [java] view plaincopy
  • public?class?Activity?extends?ContextThemeWrapper??
  • ????????implements?LayoutInflater.Factory,??
  • ????????Window.Callback,?KeyEvent.Callback,??
  • ????????OnCreateContextMenuListener,?ComponentCallbacks?{??
  • ????......??
  • ??
  • ????private?WindowManager?mWindowManager;??
  • ????......??
  • ??
  • ????public?WindowManager?getWindowManager()?{??
  • ????????return?mWindowManager;??
  • ????}??
  • ??
  • ????......??
  • }??
  • ?? ? ? ?這個函數定義在文件frameworks/base/core/java/android/app/Activity.java中。

    ?? ? ? ?從前面Android應用程序窗口(Activity)的運行上下文環境(Context)的創建過程分析一文可以知道,Activity類的成員變量mWindowManager指向的一是類型為LocalWindowManager的本地窗口管理器,Activity類的成員函數getWindowManager直接將它返回給調用者。

    ?? ? ? ?這一步執完成之后,返回到前面的Step 7中,即ActivityThread類的成員函數handleResumeActivity中,接下來就會繼續調用前面所獲得的一個 LocalWindowManager對象的成員函數addView來為當前正在激活的Activity組件的應用程序窗口視圖對象關聯一個 ViewRoot對象。

    ?? ? ? ?Step 11.?LocalWindowManager.addView

    [java] view plaincopy
  • public?abstract?class?Window?{??
  • ????......??
  • ??
  • ????private?class?LocalWindowManager?implements?WindowManager?{??
  • ????????......??
  • ??
  • ????????public?final?void?addView(View?view,?ViewGroup.LayoutParams?params)?{??
  • ????????????......??
  • ??
  • ????????????mWindowManager.addView(view,?params);??
  • ????????}??
  • ??
  • ????????......??
  • ??
  • ????????private?final?WindowManager?mWindowManager;??
  • ???
  • ????????......??
  • ????}??
  • ??
  • ????......??
  • }??
  • ?? ? ? ?這個函數定義在文件frameworks/base/core/java/android/view/Window.java中。

    ?? ? ? ?從前面Android應用程序窗口(Activity)的窗口對象(Window)的創建過程分析一 文可以知道,LocalWindowManager類的成員變量mWindowManager指向的是一個WindowManagerImpl對象,因 此,LocalWindowManager類的成員函數addView接下來調用WindowManagerImpl類的成員函數addView來給參數 view所描述的一個應用程序窗口視圖對象關聯一個ViewRoot對象。

    ?? ? ? ?Step 12.?WindowManagerImpl.addView

    [java] view plaincopy
  • public?class?WindowManagerImpl?implements?WindowManager?{??
  • ????......??
  • ??
  • ????public?void?addView(View?view,?ViewGroup.LayoutParams?params)??
  • ????{??
  • ????????addView(view,?params,?false);??
  • ????}??
  • ??
  • ????......??
  • ??
  • ????private?void?addView(View?view,?ViewGroup.LayoutParams?params,?boolean?nest)??
  • ????{??
  • ????????......??
  • ??
  • ????????final?WindowManager.LayoutParams?wparams??
  • ????????????????=?(WindowManager.LayoutParams)params;??
  • ??
  • ????????ViewRoot?root;??
  • ????????View?panelParentView?=?null;??
  • ??
  • ????????synchronized?(this)?{??
  • ????????????//?Here's?an?odd/questionable?case:?if?someone?tries?to?add?a??
  • ????????????//?view?multiple?times,?then?we?simply?bump?up?a?nesting?count??
  • ????????????//?and?they?need?to?remove?the?view?the?corresponding?number?of??
  • ????????????//?times?to?have?it?actually?removed?from?the?window?manager.??
  • ????????????//?This?is?useful?specifically?for?the?notification?manager,??
  • ????????????//?which?can?continually?add/remove?the?same?view?as?a??
  • ????????????//?notification?gets?updated.??
  • ????????????int?index?=?findViewLocked(view,?false);??
  • ????????????if?(index?>=?0)?{??
  • ????????????????if?(!nest)?{??
  • ????????????????????throw?new?IllegalStateException("View?"?+?view??
  • ????????????????????????????+?"?has?already?been?added?to?the?window?manager.");??
  • ????????????????}??
  • ????????????????root?=?mRoots[index];??
  • ????????????????root.mAddNesting++;??
  • ????????????????//?Update?layout?parameters.??
  • ????????????????view.setLayoutParams(wparams);??
  • ????????????????root.setLayoutParams(wparams,?true);??
  • ????????????????return;??
  • ????????????}??
  • ??
  • ????????????//?If?this?is?a?panel?window,?then?find?the?window?it?is?being??
  • ????????????//?attached?to?for?future?reference.??
  • ????????????if?(wparams.type?>=?WindowManager.LayoutParams.FIRST_SUB_WINDOW?&&??
  • ????????????????????wparams.type?<=?WindowManager.LayoutParams.LAST_SUB_WINDOW)?{??
  • ????????????????final?int?count?=?mViews?!=?null???mViews.length?:?0;??
  • ????????????????for?(int?i=0;?i<count;?i++)?{??
  • ????????????????????if?(mRoots[i].mWindow.asBinder()?==?wparams.token)?{??
  • ????????????????????????panelParentView?=?mViews[i];??
  • ????????????????????}??
  • ????????????????}??
  • ????????????}??
  • ??
  • ????????????root?=?new?ViewRoot(view.getContext());??
  • ????????????root.mAddNesting?=?1;??
  • ??
  • ????????????view.setLayoutParams(wparams);??
  • ??
  • ????????????if?(mViews?==?null)?{??
  • ????????????????index?=?1;??
  • ????????????????mViews?=?new?View[1];??
  • ????????????????mRoots?=?new?ViewRoot[1];??
  • ????????????????mParams?=?new?WindowManager.LayoutParams[1];??
  • ????????????}?else?{??
  • ????????????????index?=?mViews.length?+?1;??
  • ????????????????Object[]?old?=?mViews;??
  • ????????????????mViews?=?new?View[index];??
  • ????????????????System.arraycopy(old,?0,?mViews,?0,?index-1);??
  • ????????????????old?=?mRoots;??
  • ????????????????mRoots?=?new?ViewRoot[index];??
  • ????????????????System.arraycopy(old,?0,?mRoots,?0,?index-1);??
  • ????????????????old?=?mParams;??
  • ????????????????mParams?=?new?WindowManager.LayoutParams[index];??
  • ????????????????System.arraycopy(old,?0,?mParams,?0,?index-1);??
  • ????????????}??
  • ????????????index--;??
  • ??
  • ????????????mViews[index]?=?view;??
  • ????????????mRoots[index]?=?root;??
  • ????????????mParams[index]?=?wparams;??
  • ????????}??
  • ????????//?do?this?last?because?it?fires?off?messages?to?start?doing?things??
  • ????????root.setView(view,?wparams,?panelParentView);??
  • ????}??
  • ??
  • ????......??
  • ??
  • ????private?View[]?mViews;??
  • ????private?ViewRoot[]?mRoots;??
  • ????private?WindowManager.LayoutParams[]?mParams;??
  • ??
  • ????......??
  • }??
  • ?? ? ? 這個函數定義在文件frameworks/base/core/java/android/view/WindowManagerImpl.java中。

    ?? ? ? 在WindowManagerImpl類中,兩個參數版本的成員函數addView是通過調用三個參數版本的成同函數addView來實現的,因此,我們接下來就主要分析三個參數版本的成員函數addView的實現。

    ?? ? ? 在分析WindowManagerImpl類的三個參數版本的成員函數addView的實現之前,我們首先了解一下WindowManagerImpl類 是如何關聯一個應用程序窗口視圖對象(View對象)和一個ViewRoot對象的。一個View對象在與一個ViewRoot對象關聯的同時,還會關聯 一個WindowManager.LayoutParams對象,這個WindowManager.LayoutParams對象是用來描述應用程序窗口 視圖的布局屬性的。

    ?? ? ??WindowManagerImpl類有三個成員變量mViews、mRoots和mParams,它們分別是類型為View、ViewRoot和 WindowManager.LayoutParams的數組。這三個數組的大小是始終保持相等的。這樣, 有關聯關系的View對象、ViewRoot對象和WindowManager.LayoutParams對象就會分別保存在數組mViews、 mRoots和mParams的相同位置上,也就是說,mViews[i]、mRoots[i]和mParams[i]所描述的View對象、 ViewRoot對象和WindowManager.LayoutParams對象是具有關聯關系的。因此,WindowManagerImpl類的三個 參數版本的成員函數addView在關聯一個View對象、一個ViewRoot對象和一個WindowManager.LayoutParams對象的 時候,只要分別將它們放在數組mViews、mRoots和mParams的相同位置上就可以了。

    ?? ? ? 理解了一個View對象、一個ViewRoot對象和一個WindowManager.LayoutParams對象是如何關聯之后,WindowManagerImpl類的三個參數版本的成員函數addView的實現就容易理解了。

    ?? ? ? 參數view和參數params描述的就是要關聯的View對象和WindowManager.LayoutParams對象。成員函數addView首 先調用另外一個成員函數findViewLocked來檢查參數view所描述的一個View對象是否已經存在于數組中mViews中了。如果已經存在的 話,那么就說明該View對象已經關聯過ViewRoot對象以及WindowManager.LayoutParams對象了。在這種情況下,如果參數 nest的值等于false,那么成員函數addView是不允許重復對參數view所描述的一個View對象進行重新關聯的。另一方面,如果參數 nest的值等于true,那么成員函數addView只是重新修改參數view所描述的一個View對象及其所關聯的一個ViewRoot對象內部使用 的一個WindowManager.LayoutParams對象,即更新為參數params所描述的一個 WindowManager.LayoutParams對象,這是通過調用它們的成員函數setLayoutParams來實現的。

    ?? ? ? 如果參數view所描述的一個View對象還沒有被關聯過一個ViewRoot對象,那么成員函數addView就會創建一個ViewRoot對象,并且 將它與參數view和params分別描述的一個View對象和一個WindowManager.LayoutParams對象保存在數組mViews、 mRoots和mParams的相同位置上。注意,如果數組mViews、mRoots和mParams尚未創建,那么成員函數addView就會首先分 別為它們創建一個大小為1的數組,以便可以用來分別保存所要關聯的View對象、ViewRoot對象和 WindowManager.LayoutParams對象。另一方面,如果數組mViews、mRoots和mParams已經創建,那么成員函數 addView就需要分別將它們的大小增加1,以便可以在它們的末尾位置上分別保存所要關聯的View對象、ViewRoot對象和 WindowManager.LayoutParams對象。

    ?? ? ? 還有另外一個需要注意的地方是當參數view描述的是一個子應用程序窗口的視圖對象時,即WindowManager.LayoutParams對象 wparams的成員變量type的值大于等于WindowManager.LayoutParams.FIRST_SUB_WINDOW并且小于等于 WindowManager.LayoutParams.LAST_SUB_WINDOW時,那么成員函數addView還需要找到這個子視圖對象的父視 圖對象panelParentView,這是通過遍歷數組mRoots來查找的。首先,WindowManager.LayoutParams對象 wparams的成員變量token指向了一個類型為W的Binder本地對象的一個IBinder接口,用來描述參數view所描述的一個子應用程序窗 口視圖對象所屬的父應用程序窗口視圖對象。其次,每一個ViewRoot對象都通過其成員變量mWindow來保存一個類型為W的Binder本地對象, 因此,如果在數組mRoots中,存在一個ViewRoot對象,它的成員變量mWindow所描述的一個W對象的一個IBinder接口等于 WindowManager.LayoutParams對象wparams的成員變量token所描述的一個IBinder接口時,那么就說明與該 ViewRoot對象所關聯的View對象即為參數view的父應用程序窗口視圖對象。

    ?? ? ? ?成員函數addView為參數view所描述的一個View對象和參數params所描述的一個WindowManager.LayoutParams 對象關聯好一個ViewRoot對象root之后,最后還會將這個View對view象和這個WindowManager.LayoutParams對 象,以及變量panelParentView所描述的一個父應用程序窗視圖對象,保存在這個ViewRoot對象root的內部去,這是通過調用這個 ViewRoot對象root的成員函數setView來實現的,因此,接下來我們就繼續分析ViewRoot類的成員函數setView的實現。

    ?? ? ? ?Step 13. ViewRoot.setView

    [java] view plaincopy
  • public?final?class?ViewRoot?extends?Handler?implements?ViewParent,??
  • ????????View.AttachInfo.Callbacks?{??
  • ????......??
  • ??
  • ????final?WindowManager.LayoutParams?mWindowAttributes?=?new?WindowManager.LayoutParams();??
  • ????......??
  • ??
  • ????View?mView;??
  • ????......??
  • ??
  • ????final?View.AttachInfo?mAttachInfo;??
  • ????......??
  • ??
  • ????boolean?mAdded;??
  • ????......??
  • ??
  • ????public?void?setView(View?view,?WindowManager.LayoutParams?attrs,??
  • ????????????View?panelParentView)?{??
  • ????????synchronized?(this)?{??
  • ????????????if?(mView?==?null)?{??
  • ????????????????mView?=?view;??
  • ????????????????mWindowAttributes.copyFrom(attrs);??
  • ????????????????......??
  • ??
  • ????????????????mAttachInfo.mRootView?=?view;??
  • ????????????????.......??
  • ??
  • ????????????????if?(panelParentView?!=?null)?{??
  • ????????????????????mAttachInfo.mPanelParentWindowToken??
  • ????????????????????????????=?panelParentView.getApplicationWindowToken();??
  • ????????????????}??
  • ????????????????mAdded?=?true;??
  • ????????????????......??
  • ??
  • ????????????????requestLayout();??
  • ????????????????......??
  • ????????????????try?{??
  • ????????????????????res?=?sWindowSession.add(mWindow,?mWindowAttributes,??
  • ????????????????????????????getHostVisibility(),?mAttachInfo.mContentInsets,??
  • ????????????????????????????mInputChannel);??
  • ????????????????}?catch?(RemoteException?e)?{??
  • ????????????????????mAdded?=?false;??
  • ????????????????????mView?=?null;??
  • ????????????????????......??
  • ????????????????????throw?new?RuntimeException("Adding?window?failed",?e);??
  • ????????????????}?finally?{??
  • ????????????????????if?(restore)?{??
  • ????????????????????????attrs.restore();??
  • ????????????????????}??
  • ????????????????}??
  • ??
  • ????????????????......??
  • ????????????}??
  • ??
  • ????????????......??
  • ????????}??
  • ????}??
  • ??
  • ????......??
  • }??
  • ?? ? ? ?這個函數定義在文件frameworks/base/core/java/android/view/ViewRoot.java中。

    ?? ? ? ?參數view所描述的一個View對象會分別被保存在ViewRoot類的成員變量mView以及成員變量mAttachInfo所描述的一個 AttachInfo的成員變量mRootView中,而參數attrs所描述的一個WindowManager.LayoutParams對象的內容會 被拷貝到ViewRoot類的成員變量mWindowAttributes中去。

    ?? ? ? 當參數panelParentView的值不等于null的時候,就表示參數view描述的是一個子應用程序窗口視圖對象。在這種情況下,參數 panelParentView描述的就是一個父應用程序窗口視圖對象。這時候我們就需要獲得用來描述這個父應用程序窗口視圖對象的一個類型為W的 Binder本地對象的IBinder接口,以便可以保存在ViewRoot類的成員變量mAttachInfo所描述的一個AttachInfo的成員 變量mPanelParentWindowToken中去。這樣以后就可以知道ViewRoot類的成員變量mView所描述的一個子應用程序窗口視圖所 屬的父應用程序窗口視圖是什么了。注意,通過調用參數panelParentView的所描述的一個View對象的成員函數 getApplicationWindowToken即可以獲得一個對應的W對象的IBinder接口。

    ?? ? ? 上述操作執行完成之后,ViewRoot類的成員函數setView就可以將成員變量mAdded的值設置為true了,表示當前正在處理的一個 ViewRoot對象已經關聯好一個View對象了。接下來,ViewRoot類的成員函數setView還需要執行兩個操作:

    ?? ? ? 1. 調用ViewRoot類的另外一個成員函數requestLayout來請求對應用程序窗口視圖的UI作第一次布局。

    ?? ? ? 2. 調用ViewRoot類的靜態成員變量sWindowSession所描述的一個類型為Session的Binder代理對象的成員函數add來請求 WindowManagerService增加一個WindowState對象,以便可以用來描述當前正在處理的一個ViewRoot所關聯的一個應用程 序窗口。

    ?? ? ? 至此,我們就分析完成Android應用程序窗口視圖對象的創建過程了。在接下來的一篇文章中,我們將會繼續分析Android應用程序窗口與 WindowManagerService服務的連接過程,即Android應用程序窗口請求WindowManagerService為其增加一個 WindowState對象的過程,而在接下來的兩篇文章中,我們還會分析用來渲染Android應用程序窗口的Surface的創建過程,以及 Android應用程序窗口的渲染過程。通過這三個過程的分析,我們就可以看到上述第1點和第2點提到的兩個函數的執行過程,敬請期待!

    老羅的新浪微博:http://weibo.com/shengyangluo,歡迎關注!

    總結

    以上是生活随笔為你收集整理的Android应用程序窗口(Activity)的视图对象(View)的创建过程分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    亚洲电影第一页av | 精品嫩模福利一区二区蜜臀 | 亚洲国产日本 | 天天躁日日躁狠狠躁av麻豆 | 中文免费| 九月婷婷人人澡人人添人人爽 | 一区二区三区四区在线 | 久久久精品国产一区二区三区 | 亚洲jizzjizz日本少妇 | 在线日本看片免费人成视久网 | 精品国产精品国产偷麻豆 | 中文字幕在线精品 | 亚洲欧美激情精品一区二区 | 国产九九精品视频 | 欧美小视频在线 | 999久久久免费视频 午夜国产在线观看 | 五月婷亚洲 | 尤物一区二区三区 | 又湿又紧又大又爽a视频国产 | 日韩激情在线视频 | 免费看久久久 | 国产成人61精品免费看片 | 99婷婷狠狠成为人免费视频 | 亚洲欧美日韩一二三区 | 在线免费观看涩涩 | 中文字幕亚洲不卡 | 亚洲手机av | 日韩一区二区三免费高清在线观看 | 六月色婷 | 国语黄色片 | 四虎国产精品成人免费影视 | 色婷婷免费视频 | 黄色av电影免费观看 | 亚洲免费在线播放视频 | 五月婷婷激情 | 天天干,天天插 | 婷婷亚洲最大 | 96视频免费在线观看 | 国内精品在线观看视频 | 91精品久久久久久综合五月天 | 欧美一区二视频在线免费观看 | 日本公妇色中文字幕 | www在线观看国产 | 亚洲视频1| 日韩免费网站 | 精品在线你懂的 | 国产一区二区在线观看视频 | 91视频在线免费观看 | 久久国产乱 | 国产亚洲人成网站在线观看 | 成年人电影免费看 | 久久精品一区 | 国内精品一区二区 | 久久一线| 国产视频一区二区三区在线 | 中文字幕韩在线第一页 | 欧美日韩视频在线一区 | 日本中文字幕电影在线免费观看 | 久久香蕉国产精品麻豆粉嫩av | 国产一区二区播放 | 精品视频在线观看 | 国产裸体无遮挡 | 久久久久久久免费观看 | 日本成址在线观看 | 色综合激情久久 | 亚洲精品午夜国产va久久成人 | 久久观看最新视频 | 成人在线视| 中文字幕精品一区二区精品 | 婷婷综合成人 | 狠狠色丁香婷婷综合视频 | 免费看片在线观看 | 亚欧日韩成人h片 | 黄色av免费| 天堂av免费观看 | 成人免费观看网址 | 黄色毛片视频免费观看中文 | 亚洲美女久久 | 中文字幕 欧美性 | 中国一 片免费观看 | 亚洲黄在线观看 | 国产高清视频免费在线观看 | 日韩精品字幕 | 成人av网站在线观看 | 免费看片在线观看 | 日韩在线高清免费视频 | 亚洲精品美女久久 | 亚洲激情视频 | 免费a v视频 | 欧美综合国产 | 久久精品一区八戒影视 | 国精产品999国精产 久久久久 | 免费视频99 | 99精品欧美一区二区蜜桃免费 | 激情伊人五月天 | 激情综合网天天干 | 日韩高清在线看 | 在线观看成人 | 国产黄色一级片在线 | 欧美a级在线免费观看 | 一区二区三区免费在线观看视频 | 激情影音先锋 | 久久黄色免费视频 | 521色香蕉网站在线观看 | 久久精品牌麻豆国产大山 | 日韩极品视频在线观看 | 波多野结衣视频一区 | 国产一区二区在线视频观看 | 91成人网在线播放 | 成人a大片 | 久久久五月天 | 丁香婷婷网 | 国产日韩精品一区二区三区 | 国内免费的中文字幕 | 国内精品久久久久久久久久久 | 亚洲区另类春色综合小说校园片 | 亚洲女人av | 国产精品无av码在线观看 | 一级全黄毛片 | 精品久久一 | 久久久久精| av免费看电影 | 亚洲 欧美 91 | 亚洲综合精品视频 | 日韩久久精品 | 99在线视频观看 | 国产精品久久久99 | 久久精品视频在线观看免费 | 日韩在线观看视频网站 | 国产欧美日韩精品一区二区免费 | 成年人av在线播放 | 久久er99热精品一区二区三区 | 日韩精品国产一区 | 精品国产一区二区三区蜜臀 | 成 人 黄 色 视频 免费观看 | 日本午夜免费福利视频 | 最近最新中文字幕 | 国产裸体视频bbbbb | 国产精品美女999 | 国产精品99蜜臀久久不卡二区 | 日韩精品久久久久久久电影竹菊 | 天天操天天舔天天爽 | 在线观看日韩国产 | 欧美一级电影免费观看 | 中国精品一区二区 | 亚洲一区二区三区91 | 亚洲无吗av | 久久一区二区三区日韩 | 国产丝袜高跟 | 国产精品美女999 | 在线观看国产福利片 | 国产97免费 | 国产人成精品一区二区三 | 亚洲成人av电影在线 | 欧美a影视 | 视频在线精品 | av免费高清观看 | 在线免费观看欧美日韩 | 男女啪啪网站 | 国产精品欧美在线 | 国产精品久久久999 国产91九色视频 | 国产精品久久久久久超碰 | 99热国产在线观看 | 欧美久久99 | 男女视频国产 | 夜夜躁狠狠燥 | 综合影视 | 中文字幕在线专区 | 成人影视片 | 天天操天天谢 | 超碰资源在线 | 99久久久久久国产精品 | 九九久久精品视频 | 日韩高清av | 一区在线电影 | 欧美一区在线观看视频 | 天天色天天射天天干 | 黄色网址av | 欧美最猛性xxx | 懂色av懂色av粉嫩av分享吧 | 久久1区 | 成人黄大片 | 久久亚洲欧美日韩精品专区 | 男女全黄一级一级高潮免费看 | 久久国产精品免费一区二区三区 | 国产中文a| 国产丝袜制服在线 | a在线免费 | 精品伦理一区二区三区 | 24小时日本在线www免费的 | 91理论片午午伦夜理片久久 | 黄色小视频在线观看免费 | 黄p在线播放 | 在线视频黄 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 日批视频在线播放 | 欧美精品国产精品 | 四虎国产精品成人免费4hu | 国产成人久久av | 中文字幕色在线 | 精产嫩模国品一二三区 | 久久久精选 | 中文字幕在线日亚洲9 | 日韩免| 美女免费视频一区二区 | 一区二区欧美日韩 | 日韩高清dvd| 国产一级在线播放 | 中文字幕日韩av | 麻豆国产视频下载 | 国内精品久久久久久久久久 | 免费在线观看av网站 | 午夜电影av| 91成人在线免费观看 | 亚洲成人资源在线观看 | 午夜影院先 | 激情综合网天天干 | 国产精品99视频 | 亚洲综合在线一区二区三区 | 亚洲在线不卡 | 国产五码一区 | 精品黄色片| 久久成人免费视频 | 精品久久一| 国产成人精品久久久久蜜臀 | 国产精品999久久久 久产久精国产品 | 色 中文字幕 | .国产精品成人自产拍在线观看6 | 青青网视频 | 日韩性久久 | 黄色三级网站在线观看 | 久久精品伊人 | 国产精品一区二区在线观看免费 | 欧美精品乱码久久久久久 | 成人精品亚洲 | 99r在线| 日韩欧美一区二区三区黑寡妇 | 久久久高清一区二区三区 | 国产资源在线观看 | 欧美在线观看视频一区二区三区 | 在线天堂8√ | 亚洲va天堂va欧美ⅴa在线 | 91av电影| 18网站在线观看 | 天天射天天爽 | 97碰在线 | 久草免费福利在线观看 | 国产精品大片免费观看 | 不卡中文字幕av | 狠狠操电影网 | 日本美女xx | 五月天堂色 | 日本三级大片 | 午夜在线观看影院 | 久草视频在线资源 | 成人免费视频观看 | 亚洲视频在线观看网站 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | av中文字幕在线免费观看 | 天天干天天干天天色 | 中文字幕在线观看日本 | 国产又粗又长的视频 | 91在线你懂的| 97在线看 | 中文字幕一区二区三区四区视频 | 国产又粗又猛又黄又爽 | 国产精品福利久久久 | 国产一级黄色免费看 | 国产亚洲精品久久久久久久久久久久 | 一区三区视频在线观看 | 日韩一二三区不卡 | 91中文在线观看 | 亚洲人人爱| 日日爽夜夜操 | 69视频永久免费观看 | 三级视频国产 | 国产亚洲精品美女久久 | 日韩资源在线播放 | 最近中文字幕国语免费高清6 | 亚洲国产精品女人久久久 | 国产精品国产三级国产不产一地 | 国产精品尤物视频 | 91看片淫黄大片一级在线观看 | 欧美有色 | 久久好看免费视频 | 六月丁香婷婷在线 | 欧美福利视频一区 | 日韩免费电影在线观看 | 一区二区欧美在线观看 | 亚洲精品乱码久久久久久写真 | 亚洲在线激情 | 99r精品视频在线观看 | 国产一级性生活视频 | 91久色蝌蚪 | www.伊人网 | 综合网婷婷 | 日韩欧美在线观看一区二区 | 国产精品乱码一区二区视频 | 国产在线观看 | 中文字幕在线不卡国产视频 | 久久久精品国产一区二区三区 | 人人爽人人爽人人 | 天天鲁天天干天天射 | 中文资源在线观看 | 日韩专区 在线 | av免费观看高清 | 中文伊人 | 日韩一区视频在线 | 中国精品一区二区 | 一级黄色在线视频 | 国产亚洲精品久久网站 | 日日综合| 超碰99在线| 国产成人一级电影 | 国产小视频你懂的 | 午夜精品久久久 | 国产精品尤物视频 | 黄毛片在线观看 | 免费观看性生交大片3 | 亚洲精品视频中文字幕 | 久久久天堂 | 九九欧美| 中文字幕丝袜美腿 | 在线精品在线 | 成人羞羞免费 | 国产福利一区在线观看 | 日韩三级久久 | 黄色av播放| 人操人 | 色噜噜日韩精品一区二区三区视频 | 夜夜躁天天躁很躁波 | 久久久久久久久久电影 | 天堂网一区 | 99热这里只有精品1 av中文字幕日韩 | 一级黄色片在线免费看 | 色婷婷狠狠五月综合天色拍 | 人人干人人超 | 欧洲av不卡 | 成人久久亚洲 | 久久久免费播放 | 日韩在线第一 | 精品福利视频在线观看 | 视频在线观看国产 | 天天干天天干天天干 | 麻豆视频国产在线观看 | 久久久久久久久久久高潮一区二区 | 一区久久久 | 日韩免费福利 | 国产精品中文字幕在线 | 久久av免费观看 | 欧美看片 | 在线免费黄网站 | 蜜臀av在线一区二区三区 | 男女视频久久久 | 91九色porn在线资源 | 午夜精品一区二区三区免费 | 日韩精品最新在线观看 | 亚洲欧美怡红院 | 国产精品久久久久久久久蜜臀 | 国产麻豆精品一区二区 | 99情趣网视频 | 国产黄色精品网站 | 欧美一区二区三区四区夜夜大片 | 国产91精品高清一区二区三区 | 国产精品视频专区 | 国产精品资源网 | 夜夜操网站 | 成人黄色av免费在线观看 | 九九久| 在线观看一区 | 六月婷色 | 91免费观看网站 | 99热99re6国产在线播放 | 日韩一区二区三区在线看 | 国产不卡免费视频 | 日韩欧美第二页 | aa级黄色大片 | 国产欧美精品在线观看 | 制服丝袜亚洲 | 草莓视频在线观看免费观看 | 99久久精品免费看国产免费软件 | 国产精品久久人 | 91精品国产综合久久福利不卡 | 中文字幕欧美日韩va免费视频 | 久草精品电影 | 亚洲精品九九 | 麻豆精品国产传媒 | 中文字幕在线观看第一区 | 精精国产xxxx视频在线播放 | 夜夜爽夜夜操 | 久操视频在线免费看 | 久久国内精品99久久6app | 色在线网站 | 国产区在线| 天天操天天色天天射 | 欧美日韩视频在线观看一区二区 | 国产综合激情 | 中文一二区 | 精品国产乱码久久久久久天美 | 成人av中文字幕 | a级一a一级在线观看 | 欧美日韩久久一区 | 久草在线视频网站 | 久久免费电影 | 在线影院中文字幕 | 久久伊人91 | 久久久久免费电影 | 久久久久日本精品一区二区三区 | 99热国产在线中文 | 91色偷偷| 日韩av一区二区在线播放 | 国语精品久久 | 国产精品乱码一区二三区 | 在线免费观看黄色小说 | 久久综合色播五月 | 久久欧美在线电影 | 亚洲高清免费在线 | 97操碰| 日韩乱码在线 | 91免费网| 国产精品普通话 | 国产99久久久国产精品免费二区 | 成人精品一区二区三区电影免费 | 国产精品久久久久免费观看 | 免费av影视 | 欧美精品久| 久久综合之合合综合久久 | 99久e精品热线免费 99国产精品久久久久久久久久 | 日韩激情影院 | 人人插人人做 | 人人精久 | 国产一二三在线视频 | 99久久久久免费精品国产 | 色综合久久久久 | 亚洲成av人片在线观看香蕉 | 丝袜美腿在线播放 | 日韩草比 | 日韩特级黄色片 | 中文字幕第| 五月开心六月婷婷 | 最近高清中文在线字幕在线观看 | 玖玖在线播放 | 欧美一级片在线播放 | 国内精品久久久久久中文字幕 | 国产精品毛片久久久 | 亚洲人成网站精品片在线观看 | 国产破处视频在线播放 | www久久久久 | 久久夜靖品| 免费一级特黄毛大片 | 久久精品爱视频 | 福利av在线 | 99久久www免费 | 日韩国产在线观看 | 久久久精品久久 | 9999在线观看 | 久久国产精品99精国产 | 日韩精品免费 | 日韩三级视频 | 91精品免费视频 | 91视频高清免费 | 色开心| 免费观看v片在线观看 | 久久黄色片 | 国产午夜精品一区二区三区嫩草 | 97碰碰精品嫩模在线播放 | 欧美性极品xxxx做受 | 一区二区欧美激情 | 精品国产伦一区二区三区观看体验 | 日本激情动作片免费看 | 久久99中文字幕 | 国产视频在线观看一区 | 精品国产乱码久久久久久1区二区 | 免费高清在线观看电视网站 | 久久精品a| 中文字幕免费看 | 婷婷久久综合九色综合 | 五月天中文字幕mv在线 | 亚洲天堂网在线视频观看 | 亚洲精品1234区 | 欧美一级特黄高清视频 | 久久久影院官网 | 国产成人综合精品 | 丁香五月亚洲综合在线 | 色偷偷88欧美精品久久久 | 91一区二区在线 | 麻豆超碰| 国产在线日韩 | 国产丝袜一区二区三区 | 最新日韩精品 | av 一区 二区 久久 | 日韩免费一区二区 | 婷婷久久一区 | 久久免费毛片视频 | 欧美精品v国产精品 | 久久不色 | 欧美最猛性xxxx | 精品国产一区二区三区四 | 999久久久免费视频 午夜国产在线观看 | 亚洲欧洲日韩 | 成人aⅴ视频 | av在线日韩 | 中文字幕在线观看完整 | 国产特级毛片aaaaaa毛片 | 色婷婷综合久久久久 | 91人人爽人人爽人人精88v | 黄色成人av| 日本中文字幕网站 | 91视频免费看 | 天天色天天综合 | 日韩在线免费 | 天天操天天爱天天爽 | 国产中文伊人 | 天天看天天干 | 婷婷天天色 | 国产综合香蕉五月婷在线 | 精品福利av | 国产色拍拍拍拍在线精品 | 欧洲成人av | 涩涩网站在线观看 | 亚洲黄色在线免费观看 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 久草9视频| 91热视频在线观看 | 欧美激情精品久久久久久变态 | 最新国产在线 | 国产在线视频一区 | 在线成人免费 | 色91在线 | 国产精品久久久久久久久久三级 | 久久99精品久久久久久三级 | 香蕉色综合 | 久久高清免费观看 | 亚洲欧美怡红院 | 天堂av影院 | 色婷婷狠狠干 | 91av精品| 亚洲污视频| 日韩欧美电影在线 | 91在线资源 | 亚洲免费av电影 | 久久婷婷开心 | 99热国产精品 | 国产四虎影院 | 特黄免费av | 亚洲综合五月 | 黄色软件在线观看 | 国产在线a免费观看 | 精品九九九 | 夜色资源网 | 日本免费久久高清视频 | 欧美黄色免费 | 亚洲涩综合 | 日本精品久久久一区二区三区 | 99视频精品在线 | 日韩极品视频在线观看 | 久久精品五月 | 亚洲国产精选 | 午夜精品久久久久久中宇69 | 日本久热 | 欧美一级性生活视频 | 久久久久久久99 | 91试看 | 国模视频一区二区 | 久久伊99综合婷婷久久伊 | 9999亚洲| 欧美在线1 | 丁香五香天综合情 | 国语精品视频 | 亚洲最新精品 | 日韩一区在线播放 | 四虎最新域名 | 中文字幕观看视频 | 中文字幕91在线 | 久久激情五月丁香伊人 | 九九精品视频在线观看 | 91精品国产福利 | 狠狠干 狠狠操 | 久久激情精品 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 黄色三级网站 | 国产一区二区在线免费播放 | 五月激情综合婷婷 | 久久久国产精品久久久 | av动态图片 | 久久精品国产精品亚洲 | 日韩精品久久久久久久电影竹菊 | 亚洲欧洲精品久久 | 激情综合网婷婷 | 免费在线观看国产精品 | 综合激情av| 国产日韩中文字幕 | 色资源二区在线视频 | 国产又粗又猛又色 | 六月色 | 在线观看的黄色 | 久久色在线观看 | 久久欧美精品 | 视频国产区 | 国产自偷自拍 | 五月婷婷在线视频观看 | 成人a视频 | 国产探花视频在线播放 | 日韩av不卡在线观看 | 69av视频在线观看 | 日韩激情视频在线观看 | 国产欧美最新羞羞视频在线观看 | 97视频在线观看视频免费视频 | 成人a免费 | 天天干天天做 | 四虎4hu永久免费 | 午夜精品一区二区三区免费 | 五月婷婷丁香激情 | 奇米网网址| 欧美日韩国产色综合一二三四 | 久久精品导航 | 99亚洲国产精品 | 中国成人一区 | 超碰av在线| 超碰资源在线 | 国产高清免费观看 | 人人天天夜夜 | 亚洲综合欧美精品电影 | 成人av一区二区在线观看 | 日本性久久 | 特级黄色片免费看 | 福利久久久 | 成人在线视频在线观看 | 黄色成人影视 | 一区二区三区观看 | 99视频在线观看免费 | 在线观看日韩中文字幕 | 久久久久久久99精品免费观看 | 成人在线免费视频 | 国产精品久久久久久久久免费看 | 丰满少妇麻豆av | 黄色在线免费观看网址 | 亚洲一区二区三区在线看 | 成年人免费av | 国产伦理久久精品久久久久_ | 精品福利在线视频 | japanesexxx乱女另类 | 视频在线观看入口黄最新永久免费国产 | 久久99精品波多结衣一区 | 久久久精品 一区二区三区 国产99视频在线观看 | 天堂网一区二区 | 久久伊人八月婷婷综合激情 | 天天操狠狠操网站 | 99久久毛片 | 久久精品国产久精国产 | 亚洲精品视频网址 | 国产69久久久欧美一级 | 亚洲精品www | www.夜夜操| 久久国产精品色av免费看 | 狠狠色噜噜狠狠狠狠 | 日韩黄色大片在线观看 | 精品在线不卡 | 99国产成+人+综合+亚洲 欧美 | 国产视频1区2区 | 人人爱在线视频 | 中文字幕在线第一页 | 极品久久久久久久 | 色婷婷骚婷婷 | 免费看v片 | 深爱五月激情网 | 久久免费在线 | 69视频网站 | 国产成人高清在线 | 伊人亚洲综合 | 国产精品电影在线 | 亚洲欧美偷拍另类 | 成年人在线电影 | 免费黄a| 欧美日韩在线观看一区二区三区 | 久久久久久久久久网站 | 中文字幕在线国产精品 | 日韩国产精品久久 | 国产精品系列在线观看 | 玖玖在线资源 | 最新婷婷色 | 免费视频你懂得 | 亚洲精品乱码久久久久久久久久 | 美女免费电影 | 国产精品成人久久久久 | 色综合久久久久综合 | 99色在线观看 | 一区二区久久久久 | 国产精品丝袜久久久久久久不卡 | 国产一级91 | 国产成人三级在线播放 | 日韩av中文在线 | 黄色av播放 | 国产精品 国内视频 | av在线电影网站 | 色资源网免费观看视频 | av在线网站观看 | 毛片99 | 91av视频在线免费观看 | 黄色a一级视频 | 国产精品不卡 | 激情视频久久 | 一区二区三区在线观看 | 精品久久一区二区 | 久久私人影院 | 日韩成人黄色av | 中文字幕人成人 | 九九在线视频免费观看 | 亚洲精品国产精品国自产在线 | 精品毛片一区二区免费看 | 精品无人国产偷自产在线 | 日韩免费观看高清 | 久久久久成人免费 | 色综合天天狠天天透天天伊人 | 亚洲国产精品500在线观看 | 国内三级在线观看 | 99综合电影在线视频 | 国产精品欧美一区二区 | 国产精品乱码高清在线看 | 欧美日韩中文国产一区发布 | 最新av网址在线 | 午夜视频二区 | 悠悠av资源片 | 亚洲爱爱视频 | 97香蕉超级碰碰久久免费软件 | 精品国产乱码一区二区三区在线 | 国产91精品在线观看 | 九九热re| 免费看三级黄色片 | 永久免费视频国产 | 亚洲精品在线一区二区三区 | 欧美成人精品三级在线观看播放 | 麻豆视频www | 亚洲天堂精品 | 天天综合网 天天综合色 | 日韩在线播放欧美字幕 | 欧美视频xxx | 去看片| 中文字幕黄色网址 | 99久久久久 | 91精品视频观看 | 欧美日韩三级 | 中文字幕第一页在线 | 免费在线观看av的网站 | 狠狠狠狠狠操 | 欧美精品中文字幕亚洲专区 | 国产免费又粗又猛又爽 | 久久av电影| 91视频久久久 | 韩国av一区二区三区在线观看 | 久久99精品久久久久久久久久久久 | 五月婷婷欧美视频 | 久久久穴 | 男女视频91 | 日韩免费电影一区二区三区 | 午夜精品一区二区三区在线视频 | 欧美精品在线视频 | 国产日产亚洲精华av | 又色又爽又黄高潮的免费视频 | 国产成人精品午夜在线播放 | 国产精品一区二区三区在线 | 色综合久久综合网 | 成人免费 在线播放 | 久久国产a| 日日夜夜人人精品 | 成 人 黄 色 视频免费播放 | 日韩一区正在播放 | 69视频永久免费观看 | 深夜免费小视频 | 国产精品久久久久久久毛片 | 99热在线看| av在线亚洲天堂 | 91成人黄色 | 狠狠躁夜夜a产精品视频 | 国产一级免费观看视频 | 成年人黄色大全 | 狠狠干干 | 欧美精品第一 | 91免费在线看片 | 手机在线黄色网址 | 天天操网站 | 国产视频精品在线 | 国产精品毛片完整版 | 亚洲乱码精品久久久久 | 国产 日韩 中文字幕 | 99国产成+人+综合+亚洲 欧美 | 天天操天天射天天 | av亚洲产国偷v产偷v自拍小说 | ww亚洲ww亚在线观看 | 色噜噜在线观看 | 视频一区二区视频 | 视频在线精品 | 三级av在线免费观看 | 狠狠操电影网 | 国内精品久久久久久久久 | 午夜神马福利 | www.国产高清| 婷婷色网视频在线播放 | 国产精品99久久久久人中文网介绍 | 免费色av | 97韩国电影 | 最近久乱中文字幕 | 久久久久二区 | 亚洲高清视频在线观看免费 | a级国产乱理论片在线观看 特级毛片在线观看 | 中文字幕在线字幕中文 | 国产黄色av影视 | 操夜夜操 | 国产一区二区影院 | 人人玩人人添人人澡97 | 中文字幕视频一区 | 激情久久伊人 | 久久综合狠狠综合久久激情 | 在线免费色视频 | 国产五码一区 | 国产高清av免费在线观看 | 网站在线观看你们懂的 | 黄色国产区| 香蕉在线视频观看 | 最新av电影网址 | 日本高清xxxx | 精品国产一区二区三区久久影院 | 日韩网站在线免费观看 | 久久午夜鲁丝片 | 国产欧美在线一区 | 又黄又爽又无遮挡免费的网站 | 亚洲人在线7777777精品 | 伊人色综合网 | 97超碰成人 | 日韩在线观看视频一区二区三区 | 久久激情视频 久久 | 免费高清在线视频一区· | 日韩免费观看视频 | 999抗病毒口服液 | 亚洲作爱 | 最新av电影网址 | 97国产在线播放 | 久久久电影| 亚州人成在线播放 | 欧美日韩xxxxx | 不卡av电影在线 | 麻豆视频国产 | 波多野结衣视频一区 | 日韩久久精品一区 | 天天色综合三 | av在线一 | 开心综合网 | 亚洲3级 | 97在线免费 | www.色就是色 | 国产成人av网 | 国产精品一区二区久久精品爱微奶 | 午夜影院先| 亚洲国产成人久久综合 | 免费av电影网站 | 综合网色| 免费影视大全推荐 | 一级黄色在线免费观看 | 色婷婷 亚洲 | 91在线观看高清 | 国产精品人人做人人爽人人添 | 久久91网 | 91伊人久久大香线蕉蜜芽人口 | 亚洲国产丝袜在线观看 | 国产精品6999成人免费视频 | 久久久久女人精品毛片九一 | 国产成人av一区二区三区在线观看 | 精品一区二区在线免费观看 | 日韩av在线小说 | 日本久久久影视 | 91大神电影| 国产高清中文字幕 | 狂野欧美激情性xxxx欧美 | 97视频免费观看 | 中文字幕在线播放日韩 | 色成人亚洲网 | 亚洲精品456在线播放乱码 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 天天射天天操天天干 | 国产精品成人aaaaa网站 | 婷婷在线资源 | 天天插日日射 | 国产一区二区在线免费视频 | 国产一区二区三区久久久 | 不卡国产在线 | 毛片网站免费在线观看 | 国产字幕av | 五月激情电影 | 日韩免费在线 | 91久久在线观看 | www..com黄色片 | 奇米影视在线99精品 | 91视频免费看网站 | 免费观看性生活大片3 | 亚洲精品99久久久久中文字幕 | 久久艹影院 | 91九色国产视频 | 毛片网站在线观看 | 久久夜色精品国产欧美乱极品 | 久久夜色电影 | 成人香蕉视频 | 天天干夜夜擦 | 久久经典国产视频 | 五月婷婷综合色拍 | 女人18片毛片90分钟 | 色射爱 | 国产 欧美 日产久久 | 亚洲视频久久久久 | av直接看| 一级a性色生活片久久毛片波多野 | www日日夜夜 | 波多野结衣视频一区二区三区 | 欧美一区二区三区在线视频观看 | 中文字幕在线观看你懂的 | 亚洲最大在线视频 | 99热最新网址 | 亚洲干视频在线观看 | 一级免费黄视频 | 亚洲精品男人天堂 | 中文字幕一区二区三区在线观看 | av丁香| 日日爽天天 | 丁香五月亚洲综合在线 | av在线播放免费 | 天天综合视频在线观看 | 久章操 | 中文字幕精品一区二区三区电影 | 精品国产一区二区三区久久影院 | 天天天干夜夜夜操 | 国产在线美女 | 免费观看的黄色片 | 在线观看中文字幕第一页 | 天天干天天干天天色 | 久草在线高清视频 | 国产视频一区精品 | 性色av一区二区三区在线观看 | 97电影院网 | 欧美另类高潮 | 成人午夜精品福利免费 | 最新中文在线视频 | 亚洲第一av在线播放 | 亚洲v精品| 97久久精品午夜一区二区 | 91激情| 国产精品一区二区白浆 | 日本性高潮视频 | 国产精品女同一区二区三区久久夜 | 国产精品成人免费精品自在线观看 | av电影不卡在线 | 午夜精品一区二区国产 | 久久久久久综合 | 亚洲国产精彩中文乱码av | 国精产品永久999 | 亚洲在线精品视频 | 黄色一二级片 | 国产美女主播精品一区二区三区 | 久久久午夜剧场 | 日日干天天插 | 岛国av在线 | 天天插天天干天天操 | 免费看污片 | 91丨porny丨九色 | 99久久久| 国产日韩视频在线观看 | 精品伊人久久久 | 麻豆国产露脸在线观看 | 午夜黄色影院 | 91av在线视频免费观看 | 国产欧美在线一区二区三区 | 在线国产激情视频 | 国产精品入口麻豆www | 欧美久久影院 | 久久你懂的| 成人av电影免费观看 | 久久久久久久久网站 | 亚洲午夜av | 亚洲欧洲精品一区二区精品久久久 | 九九热精品视频在线播放 | 在线观看www91 | 午夜精品福利一区二区 | 久久激情网站 | 日日干天天爽 | 日本黄色免费在线 | 欧美国产不卡 | 日韩免费观看一区二区 | 久久精品亚洲国产 | av高清在线观看 | 91女人18片女毛片60分钟 | 欧美9999| 国产日韩一区在线 | 欧美另类高清 videos | 天天操天天透 | 午夜色影院 | 人人澡av | av在线免费不卡 | 一二区精品 | 国产精品入口a级 | 免费看搞黄视频网站 |