精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在Android系統中,一個Activity的Window創建和添加過程

移動開發 Android
addToDisplay?方法內部調用了mService的addWindow?方法,并將Session?對象本身作為第一個參數傳進去。mService?就是WMS?的實例,每一個app進程?都會對應一個Session對象用來表示app進程與WMS的通信渠道。

在Android系統中,一個Activity通常就表示一個頁面,這個頁面實際是由Window來管理的,每個Activity都對應著一個Window。Window是一個抽象類,具體實現類是PhoneWindow,對View進行管理。確切的來講是,PhoneWindow包含一個DecorView類型的成員,代表這個Window的頂層View,是一個FrameLayout。DecorView的布局結構包含兩部分:標題欄(title)和內容欄(content)。根據設置的主題不同,這兩部分也會有不同的呈現。但內容欄是一定存在的,并且id是固定的android.R.id.content。

Window的創建過程

Window的創建過程是一個涉及多個層次和組件的復雜過程。

  • 當啟動一個Activity或系統通過Intent觸發一個Activity時,這個Activity的生命周期開始。
  • onCreate()方法被調用,這是Activity生命周期中的一個重要回調。
  • 在onCreate()方法中,通常會調用setContentView()來設置Activity的布局。
  • setContentView()方法會觸發Window對象的創建。在Android中,每個Activity都與一個Window對象相關聯。
  • Window對象通常是一個PhoneWindow的實例,用于處理與窗口相關的各種功能。

Activity啟動過程在ActivityThread的performLaunchActivity方法,會調用Activity的attach方法。與Activity相關聯的Window對象就是在attach方法中創建的。

final void attach(Context context, ActivityThread aThread,
        Instrumentation instr, IBinder token, int ident,
        Application application, Intent intent, ActivityInfo info,
        CharSequence title, Activity parent, String id,
        NonConfigurationInstances lastNonConfigurationInstances,
        Configuration config, String referrer, IVoiceInteractor voiceInteractor,
        Window window, ActivityConfigCallback activityConfigCallback, IBinder assistToken) {
    attachBaseContext(context);
    ...
    mWindow = new PhoneWindow(this, window, activityConfigCallback);
    mWindow.setWindowControllerCallback(this);
    mWindow.setCallback(this);
    mWindow.setOnWindowDismissedCallback(this);
    mWindow.getLayoutInflater().setPrivateFactory(this);
    if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
        mWindow.setSoftInputMode(info.softInputMode);
    }
    if (info.uiOptions != 0) {
        mWindow.setUiOptions(info.uiOptions);
    }
    ...
    mWindow.setWindowManager(
            (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
            mToken, mComponent.flattenToString(),
            (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
     ...

    mWindow.setColorMode(info.colorMode);
}

在attach方法中創建了一個PhoneWindow對象,并設置回調接口Callback和WindowManager。由于Activity類實現了Window.Callback接口,當Window接收到相關的事件觸發時就會調用Activity的相應方法。Callback接口中的方法很多,有幾個是我們比較常見的,比如dispatchTouchEvent、onAttachedToWindow、onDetachedFromWindow等。

Window的添加過程

  • 與Window對象關聯的是一個DecorView。DecorView是一個特殊的ViewGroup,包含了窗口的標題欄(如果有的話)和主要內容區域。
  • DecorView的創建是在Window的創建過程中自動完成的,并且與Window對象緊密相關。
  • 通過setContentView()方法加載的布局文件(通常是XML文件)會被解析并轉換為相應的View對象。
  • 這些View對象被添加到DecorView的內容區域中,形成一個View樹。
  • 繪制的結果被渲染到屏幕上,就能看到Activity的界面了。

ActivityThread的performLaunchActivity方法:

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
        ...
        activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.referrer, r.voiceInteractor, window, r.configCallback);
        ...
        if (r.isPersistable()) {
                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                } else {
                    mInstrumentation.callActivityOnCreate(activity, r.state);
                }
}

在Activity的attach方法返回后,程序會調用mInstrumentation.callActivityOnCreate方法,而這個方法最終會觸發Activity的onCreate回調。而在onCreate中,會調用setContentView方法,開始Activity的Window添加過程。

public void setContentView(@LayoutRes int layoutResID) {
    getWindow().setContentView(layoutResID);
    initWindowDecorActionBar();
}

Activity的setContentView方法內部調用的mWindow的setContentView方法,這個mWindow對象就是在attach方法中創建的PhoneWindow對象。

public void setContentView(int layoutResID) {
    if (mContentParent == null) {
        installDecor();
    } else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
        mContentParent.removeAllViews();
    }


    if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
        final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,
                getContext());
        transitionTo(newScene);
    } else {
        mLayoutInflater.inflate(layoutResID, mContentParent);
    }
    mContentParent.requestApplyInsets();
    final Callback cb = getCallback();
    if (cb != null && !isDestroyed()) {
        cb.onContentChanged();
    }
    mContentParentExplicitlySet = true;
}

PhoneWindow的setContentView中,首先判斷mContentParent是否存在,否則調用installDecor方法。這個mContentParent指的就是DecorView的內容欄。它的賦值就只有一個地方,就是在installDecor方法中。

private void installDecor() {
    mForceDecorInstall = false;
    if (mDecor == null) {
        mDecor = generateDecor(-1);
        mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
        mDecor.setIsRootNamespace(true);
        if (!mInvalidatePanelMenuPosted && mInvalidatePanelMenuFeatures != 0) {
            mDecor.postOnAnimation(mInvalidatePanelMenuRunnable);
        }
    } else {
        mDecor.setWindow(this);
    }
    if (mContentParent == null) {
        mContentParent = generateLayout(mDecor);
    ...
}

如果mDecor為null,就先調用generateDecor方法創建DecorView。

protected DecorView generateDecor(int featureId) {
    ...
    return new DecorView(context, featureId, this, getAttributes());
}

DecorView對象創建之后,再判斷mContentParent對象是否存在,不存在調用generateLayout方法。

protected ViewGroup generateLayout(DecorView decor) {
    ...
    ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);
    ...
    return contentParent;
}

generateLayout會返回一個ViewGroup對象contentParent,ID_ANDROID_CONTENT就是com.android.internal.R.id.content。

最后調用mLayoutInflater.inflate(layoutResID, mContentParent)方法,將Activity的布局視圖添加到mContentParent中,回調Activity的onContentChanged方法通知Activity視圖已經發生改變。

這個時候,Activity的視圖布局還沒有顯示出來,DecorView還沒有被WindowManager正式添加到窗口中。

在Activity執行onResume方法之后視圖才能完全顯示,并和用戶正常交互,onResume方法是在ActivityThread的handleLaunchActivity方法中回調。

private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {
    ...
    Activity a = performLaunchActivity(r, customIntent);
    if (a != null) {
    r.createdConfig = new Configuration(mConfiguration);
    reportSizeConfigurations(r);
    Bundle oldState = r.state;
    handleResumeActivity(r.token, false, r.isForward,
            !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);
    ...
}

執行完performLaunchActivity方法返回一個Activity的實例,接下來判斷如果創建的Activity實例不為null,就會執行handleResumeActivity方法。

final void handleResumeActivity(IBinder token,
        boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) {
    ...
    r = performResumeActivity(token, clearHide, reason);
    if (r != null) {
        final Activity a = r.activity;
        ...
        if (r.activity.mVisibleFromClient) {
            r.activity.makeVisible();
        }
    ...
}

在handleResumeActivity方法中,會調用performResumeActivity方法,經過層層調用最終會回調Activity的onResume方法。

handleResumeActivity中,在performResumeActivity方法執行之后,會調用Activity的makeVisible方法。

void makeVisible() {
    if (!mWindowAdded) {
        ViewManager wm = getWindowManager();
        wm.addView(mDecor, getWindow().getAttributes());
        mWindowAdded = true;
    }
    mDecor.setVisibility(View.VISIBLE);
}

在makeVisible方法中,會調用WindowManager的addView方法,將DecorView正式添加到窗口中,同時DecorView設置為可見。

@Override
public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
    applyDefaultToken(params);
    mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow);
}

在WindowManagerImpl的addView方法內部,調用的是WindowManagerGlobal的addView方法。WindowManagerImpl通過橋接模式,將功能實現委托給了WindowManagerGlobal。WindowManagerGlobal是一個單例,說明一個進程中只有一個WindowManagerGlobal實例。每一個Window都會有一個相關聯的WindowManagerImpl實例。

public void addView(View view, ViewGroup.LayoutParams params,
        Display display, Window parentWindow) {
    if (view == null) {
        throw new IllegalArgumentException("view must not be null");
    }
    if (display == null) {
        throw new IllegalArgumentException("display must not be null");
    }
    if (!(params instanceof WindowManager.LayoutParams)) {
        throw new IllegalArgumentException("Params must be WindowManager.LayoutParams");
    }
    final WindowManager.LayoutParams wparams = (WindowManager.LayoutParams) params;
    if (parentWindow != null) {
        parentWindow.adjustLayoutParamsForSubWindow(wparams);
    } else {
        final Context context = view.getContext();
        if (context != null
                && (context.getApplicationInfo().flags
                        & ApplicationInfo.FLAG_HARDWARE_ACCELERATED) != 0) {
            wparams.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
        }
    }
    ViewRootImpl root;
    View panelParentView = null;
    ...
        int index = findViewLocked(view, false);
        if (index >= 0) {
            if (mDyingViews.contains(view)) {
                // Don't wait for MSG_DIE to make it's way through root's queue.
                mRoots.get(index).doDie();
            } else {
                throw new IllegalStateException("View " + view
                        + " has already been added to the window manager.");
            }
            // The previous removeView() had not completed executing. Now it has.
        }
        if (wparams.type >= WindowManager.LayoutParams.FIRST_SUB_WINDOW &&
                wparams.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW) {
            final int count = mViews.size();
            for (int i = 0; i < count; i++) {
                if (mRoots.get(i).mWindow.asBinder() == wparams.token) {
                    panelParentView = mViews.get(i);
                }
            }
        }
        root = new ViewRootImpl(view.getContext(), display);
        view.setLayoutParams(wparams);
        mViews.add(view);
        mRoots.add(root);
        mParams.add(wparams);
        try {
            root.setView(view, wparams, panelParentView);
        } catch (RuntimeException e) {
            // BadTokenException or InvalidDisplayException, clean up.
            if (index >= 0) {
                removeViewLocked(index, true);
            }
            throw e;
        }
    }
}

WindowManagerGlobal的addView方法主要完成三個步驟:

  • 檢查參數是否合法,如果是子Window還需要調整一些布局參數
  • 創建ViewRootImpl,并將傳進來的View添加到mViews列表里
  • 通過ViewRootImpl來更新界面并完成Window的添加過程。

最終調用了root.setView(view, wparams, panelParentView)方法。

public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
    ...
    requestLayout();
    ...
    try {
    mOrigWindowType = mWindowAttributes.type;
    mAttachInfo.mRecomputeGlobalAttributes = true;
    collectViewAttributes();
    res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,
            getHostVisibility(), mDisplay.getDisplayId(),
            mAttachInfo.mContentInsets, mAttachInfo.mStableInsets,
            mAttachInfo.mOutsets, mInputChannel);
    ...
}

View樹被構建完成,系統會遍歷這個樹,對每個View進行測量和布局,調用requestLayout方法會觸發View層級的繪制遍歷,requestLayout方法內部會調用scheduleTraversals方法。scheduleTraversals方法實際就是View繪制過程的入口。

然后會調用mWindowSession對象的addToDisplay方法,mWindowSession的類型是IWindowSession,是一個Binder對象,用于進程間通信,IWindowSession是Client端的代理。Server端實現是Session。代碼都是運行在Activity所在的app進程,Session的addToDisplay方法則是運行在WMS所在的SystemServer進程中。

圖片圖片

@Override
public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs,
        int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets,
        Rect outOutsets, InputChannel outInputChannel) {
    return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
            outContentInsets, outStableInsets, outOutsets, outInputChannel);
}

addToDisplay方法內部調用了mService的addWindow方法,并將Session對象本身作為第一個參數傳進去。mService就是WMS的實例,每一個app進程都會對應一個Session對象用來表示app進程與WMS的通信渠道。WMS會用ArrayList來存放這些Session對象。WMS會為這個要添加的窗口分配Surface,并確定窗口的顯示次序,真正負責顯示界面視圖的是畫布Surface而不是窗口本身。WMS會將所管理的Surface交由SurfaceFlinger處理,SurfaceFlinger會將這些Surface混合并繪制并最終呈現到屏幕上。

責任編輯:武曉燕 來源: 沐雨花飛蝶
相關推薦

2023-03-15 09:00:43

SwiftUISlider

2015-08-06 13:44:21

swiftcocoapods

2011-07-19 17:05:22

Xcode Libary

2024-01-29 10:20:39

Obsidian鏈接

2010-01-11 17:21:26

Linux Fedor

2020-09-29 07:24:14

Python字典數據

2010-04-15 17:45:26

Oracle存儲過程

2011-03-10 10:45:47

Azure“Hello Worl

2024-10-14 17:13:48

模塊Python編程

2018-09-08 09:05:00

UbuntuLinuxIP地址

2009-09-22 11:54:42

ibmdwPHP

2012-11-21 11:48:23

i-NVMM加密密碼

2011-04-08 10:29:04

AccessMIS管理系統

2022-03-30 08:19:12

JavaGroovy

2011-07-20 09:16:02

MongoDB索引稀疏索引

2020-12-16 14:29:40

終端開發shell

2022-02-10 22:34:51

對象JVM收集器

2018-11-05 15:14:42

MySQL編程語言技術

2011-07-29 13:21:31

CTE遞歸存儲過程真分頁

2017-03-13 14:30:38

Android開發庫指南
點贊
收藏

51CTO技術棧公眾號

日韩伦理在线一区| 日本久久一级片| 久久精品不卡| 精品久久五月天| 免费看的黄色大片| 色网站在线看| 成人av电影免费观看| 日本精品久久久| 91香蕉视频网| 日韩极品在线| 欧美电影一区二区三区| 国产96在线 | 亚洲| av网站在线免费观看| 国产91精品露脸国语对白| 国产成+人+综合+亚洲欧美丁香花| 老司机深夜福利网站| 另类尿喷潮videofree| 欧美日韩一区在线| 精品无码一区二区三区在线| 91露出在线| www.亚洲在线| 91免费精品视频| 无码人妻精品一区二区三区蜜桃91| 亚洲国产一区二区在线观看| 亚洲热线99精品视频| 女人扒开腿免费视频app| 九色成人搞黄网站| 欧美丝袜美女中出在线| 人人妻人人澡人人爽欧美一区| 视频午夜在线| 国产一区二区在线看| 日韩av电影院| 免费在线观看黄网站| 中文字幕乱码亚洲无线精品一区 | 亚洲三级小视频| 欧美一进一出视频| 香蕉久久一区二区三区| 国产·精品毛片| 91久久爱成人| 国产男女裸体做爰爽爽| 日本不卡一区二区| 欧美亚洲国产视频小说| 日韩av免费网址| 欧美精品18| 欧美成人精品一区| 日韩高清dvd碟片| 日韩久久久久| 在线观看成人黄色| 国产在线综合视频| 日本高清免费电影一区| 伊是香蕉大人久久| 亚洲av熟女国产一区二区性色| 国产不卡av一区二区| 亚洲乱码国产乱码精品精| 成人网站免费观看| 亚洲免费观看高清完整版在线观| 精品偷拍一区二区三区在线看| 俄罗斯女人裸体性做爰| 亚洲天堂av资源在线观看| 欧美精品久久一区二区三区| 天天干天天色天天干| 亚洲久草在线| 欧美成人精品1314www| 野花视频免费在线观看| 136福利精品导航| 亚洲精品一区二区在线观看| www.17c.com喷水少妇| 高清欧美性猛交xxxx黑人猛| 日韩欧美国产综合一区 | 欧美成人免费全部| 日韩va亚洲va欧美va清高| 夜间精品视频| 欧美黄色片视频| 男人的天堂一区二区| 国产精品综合| 国产精品日韩av| 精品国产无码一区二区| 粉嫩高潮美女一区二区三区| 国产高清在线一区| 少妇性bbb搡bbb爽爽爽欧美| 国产欧美日韩视频在线观看| 日韩视频在线免费播放| 精灵使的剑舞无删减版在线观看| 一区二区三区四区五区视频在线观看 | 亚洲一区在线不卡| 国产激情精品一区二区三区| 欧美成人vps| 受虐m奴xxx在线观看| 国产精品国内免费一区二区三区| 九九久久国产精品| 国产手机在线视频| 日韩av一级片| 懂色一区二区三区av片| 日夜干在线视频| 中文字幕在线观看不卡视频| 麻豆视频传媒入口| 亚洲欧美一区二区三区| 91精品国产色综合久久ai换脸 | 国产区精品在线| www.日本不卡| 中文字幕一区二区三区在线乱码| 久久99亚洲网美利坚合众国| 欧美综合一区二区三区| 日本中文字幕有码| 全球成人免费直播| 97国产suv精品一区二区62| 999视频在线| 岛国精品在线播放| 视频一区二区三| heyzo高清中文字幕在线| 欧美系列一区二区| 日本少妇xxxx| 91精品蜜臀一区二区三区在线| 2021国产精品视频| 国产成人精品一区二区无码呦 | 日本亚洲免费观看| 国产女主播一区二区三区| 午夜免费福利在线观看| 黑人巨大精品欧美一区免费视频 | 99精品偷自拍| 99久久久精品视频| 欧美亚洲人成在线| 日韩一级欧美一级| 女同久久另类69精品国产| 亚洲精品乱码| 福利视频一区二区三区| 麻豆视频在线| 欧美日韩国产综合一区二区三区 | 亚洲国产精品久久久久蝴蝶传媒| 国产成人精品久久二区二区91| 男人天堂手机在线观看| 亚洲美女屁股眼交3| 欧美女同在线观看| 欧美一区二区性| 日韩美女视频中文字幕| 亚洲欧美日韩动漫| 亚洲色图视频免费播放| 午夜免费看毛片| 超碰成人久久| 国产精品久久久久久久久久久久久久 | 青青草国产在线观看| 麻豆免费看一区二区三区| 欧美日韩亚洲在线| 欧美一级鲁丝片| 亚洲黄色在线观看| 日干夜干天天干| 成人av资源站| 青青青在线视频播放| 国产精品2023| 欧美怡春院一区二区三区| 亚洲av电影一区| 色婷婷综合久久久| 亚洲成人黄色av| 蜜桃久久久久久| 在线天堂一区av电影| 日韩综合久久| 美日韩在线视频| 亚洲成人777777| 亚洲不卡一区二区三区| 欧美 变态 另类 人妖| 久久一区亚洲| 亚洲一区免费看| 超碰国产精品一区二页| 精品中文字幕在线观看| 日本久久一级片| 岛国av在线不卡| 国产精品扒开腿做爽爽| 奇米精品一区二区三区四区| 亚洲日本欧美在线| 经典三级久久| 午夜精品福利在线观看| 男男电影完整版在线观看| 91福利视频网站| 99自拍视频在线| youjizz久久| 91香蕉视频污版| 亚洲欧美在线专区| 国产一区二区高清不卡| 深夜成人福利| 九九精品在线播放| 欧美色图另类| 欧美一区二区三区在线观看 | a级毛片免费观看在线| 精品嫩草影院久久| 五月婷婷激情五月| 伊人色综合久久天天| 精品人妻一区二区三区日产乱码卜| 欧美bbbbb| 天堂8在线天堂资源bt| 亚洲最好看的视频| 91免费看片网站| 美女福利一区二区三区| 久久av.com| 欧美亚洲日本| 欧美一二三区在线| 波多野结衣激情视频| 一区二区三区四区五区视频在线观看| 欧美亚一区二区三区| 狠狠v欧美v日韩v亚洲ⅴ| 欧美变态另类刺激| 欧美精品网站| 亚洲精品永久www嫩草| 国产福利一区二区精品秒拍| 国产精品中文字幕在线| 在线观看特色大片免费视频| xxx欧美精品| 青青草视频免费在线观看| 欧美一级在线视频| 无码久久精品国产亚洲av影片| 亚洲图片欧美一区| 欧美激情精品久久久久久免费| 久久久久久久久久久久久久久99 | 欧美精品99久久| 欧美精品国产一区| 亚洲国产一区二区在线| 色88888久久久久久影院| 97超碰人人看人人| 亚洲成人精品综合在线| 国产精品久久999| 在线观看网站免费入口在线观看国内 | 日本一区二区三区免费观看| 国产精品17p| 91嫩草免费看| 亚洲精品69| 国产日韩欧美中文| 日韩精品麻豆| 国产精品9999| 欧美日韩视频免费观看| 77777亚洲午夜久久多人| 国产乱码在线| 欧美高清视频在线观看| 91网在线看| 蜜臀久久99精品久久久无需会员 | 加勒比一区二区三区在线| 亚洲第一区在线观看| 亚洲a视频在线| 精品日产卡一卡二卡麻豆| 99久久婷婷国产一区二区三区| 欧美午夜精品一区二区三区| 蜜臀尤物一区二区三区直播| 日韩欧美精品网址| 天天干天天干天天操| 欧美午夜女人视频在线| 国产高清中文字幕| 黑人巨大精品欧美一区二区免费| 天天插天天操天天干| 欧美日韩国产精品| av中文在线播放| 欧美性开放视频| 91黑人精品一区二区三区| 在线视频欧美精品| 在线免费a视频| 7777精品久久久大香线蕉| 国产精品久久婷婷| 日韩一区二区电影在线| 男人天堂网在线视频| 日韩精品在线观| 精品三级久久久久久久电影聊斋| 亚洲香蕉成视频在线观看| 岛国最新视频免费在线观看| 尤物九九久久国产精品的特点| av在线免费一区| 久久网福利资源网站| 欧美xxxx视频| 2019精品视频| av在线播放一区| 亚洲va欧美va国产综合久久| 风间由美一区二区av101| 欧美精品一区二区三区久久| 欧美一二区在线观看| japanese在线播放| 亚洲美女毛片| 一区二区成人网| 国产盗摄精品一区二区三区在线| 大尺度做爰床戏呻吟舒畅| 亚洲国产精品黑人久久久| 波多野结衣亚洲一区二区| 亚洲成在人线在线播放| 国产午夜麻豆影院在线观看| 欧美高清dvd| 亚洲 另类 春色 国产| 日韩在线观看高清| 免费成人在线电影| 国产日产欧美a一级在线| 哺乳一区二区三区中文视频| 日本一区二区三区免费观看| 牛牛国产精品| 男人透女人免费视频| 韩国av一区二区三区四区| 亚洲观看黄色网| 国产精品国产精品国产专区不蜜| 九九热视频精品| 欧美午夜片在线看| 黄色一级大片在线免费看国产一 | 蜜桃视频在线观看91| 色婷婷色综合| 欧美一级在线看| 韩国女主播成人在线| 鲁大师私人影院在线观看| 亚洲天堂2016| 男操女视频网站| 日韩成人av在线| 国产丝袜在线| 国产精品久久久久久网站| 美日韩黄色大片| 中文字幕精品在线播放| 日韩成人伦理电影在线观看| xxxwww国产| 亚洲免费电影在线| 波多野结衣网站| 亚洲精品xxx| 色在线视频网| 成人羞羞国产免费| 神马久久一区二区三区| 人人妻人人添人人爽欧美一区| 久久91精品久久久久久秒播| 亚洲第一成人网站| 亚洲高清在线视频| 亚洲AV无码精品自拍| 日韩中文字幕在线视频| 日本高清不卡一区二区三区视频| 好看的日韩精品视频在线| 欧美日韩网站| 992kp免费看片| 中文字幕在线不卡一区二区三区| 国产女主播喷水视频在线观看 | 7777精品伊人久久久大香线蕉经典版下载 | 国产精品每日更新在线播放网址| 午夜婷婷在线观看| 日韩禁在线播放| 成年男女免费视频网站不卡| 爱情岛论坛亚洲入口| 欧美日韩国内| 日本黄色www| 亚洲精品成人少妇| a级片在线播放| 欧美另类在线观看| 亚洲一区二区三区在线免费| 亚洲第一页在线视频| 久久国产精品第一页| 成人黄色短视频| 欧美高清一级片在线| 国产精品va在线观看视色| 成人欧美一区二区三区黑人| 99久久国产综合精品成人影院| 天天综合网日韩| 国产精品理伦片| 国产精品日韩无码| 久久精品视频亚洲| 玖玖精品一区| 日本人体一区二区| 2020国产精品| 天堂免费在线视频| 日韩在线观看成人| 亚洲一区二区三区日本久久九| 人妻av无码专区| 99国产一区二区三精品乱码| av网站中文字幕| 伊人伊成久久人综合网小说| 亚洲久草在线| www.av片| 国产欧美视频一区二区| 国产原创中文av| 欧美极品在线播放| 免费视频国产一区| 午夜两性免费视频| 亚洲乱码国产乱码精品精的特点 | 日韩中文字幕第一页| 国产一区 二区| 国产资源在线视频| 国产女主播视频一区二区| av天堂一区二区三区| 羞羞色国产精品| 久久国产精品亚洲人一区二区三区 | 黄瓜视频成人app免费| 亚欧洲精品在线视频免费观看| 国产一区久久久| 亚洲视频 欧美视频| 久久激情视频免费观看| 国产精品99久久免费观看| 男女视频一区二区三区| 亚洲色图在线播放| 婷婷国产在线| 亚洲最大av在线| 老鸭窝毛片一区二区三区| 农村黄色一级片| 亚洲三级 欧美三级| 欧美经典一区| 成人一区二区三| 亚洲一区二区在线免费看| 国产三级视频在线看| 粉嫩av免费一区二区三区| 日韩综合在线视频| 久久久久久久黄色| 在线亚洲欧美视频| 狠狠久久伊人| 亚洲视频在线不卡| 色94色欧美sute亚洲线路一久| 日本天码aⅴ片在线电影网站| 日本不卡二区高清三区|