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

Window十二問(快扶我起來,我還能問)

系統 Windows
Window是個概念性的東西,你看不到他,如果你能感知它的存在,那么就是通過View,所以View是Window的存在形式,有了View,你才感知到View外層有一個皇帝的新衣——window。

[[378290]]

前言

關于Window,你了解多少呢?看看下面這些問題你都能答上來嗎。

如果你遇到這些問題

  • Window是什么?和View的關系?
  • WindowManager是什么?和WMS的關系?
  • 怎么添加一個Window?
  • Window怎樣可以顯示到鎖屏界面
  • Window三種類型都存在的情況下,顯示層級是怎樣。
  • Window就是指PhoneWindow嗎?
  • PhoneWindow什么時候被創建的?
  • 要實現可以拖動的View該怎么做?
  • Window的添加、刪除和更新過程。
  • Activity、PhoneWindow、DecorView、ViewRootImpl 的關系?
  • Window中的token是什么,有什么用?
  • Application中可以直接彈出Dialog嗎?
  • 關于事件分發,事件到底是先到DecorView還是先到Window的?

Window是什么

窗口。你可以理解為手機上的整個畫面,所有的視圖都是通過Window呈現的,比如Activity、dialog都是附加在Window上的。Window類的唯一實現是PhoneWindow,這個名字就更加好記了吧,手機窗口唄。

那Window到底在哪里呢?我們看到的View是Window嗎?是也不是。

  • 如果說的只是Window概念的話,那可以說是的,View就是Window的存在形式,Window管理著View。
  • 如果說是Window類的話,那確實不是View,唯一實現類PhoneWindow管理著當前界面上的View,包括根布局——DecorView,和其他子view的添加刪除等等。

不知道你暈沒有,我總結下,Window是個概念性的東西,你看不到他,如果你能感知它的存在,那么就是通過View,所以View是Window的存在形式,有了View,你才感知到View外層有一個皇帝的新衣——window。

WindowManager是什么?和WMS的關系?

WindowManager就是用來管理Window的,實現類為WindowManagerImpl,實際工作會委托給WindowManagerGlobal類中完成。

而具體的Window操作,WM會通過Binder告訴WMS,WMS做最后的真正操作Window的工作,會為這個Window分配Surface,并繪制到屏幕上。

怎么添加一個Window?

  1. var windowParams: WindowManager.LayoutParams = WindowManager.LayoutParams() 
  2.     windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
  3.     windowParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG 
  4.     var btn = Button(this) 
  5.     windowManager.addView(btn, windowParams) 

簡單貼了下代碼,加了一個Button。

有的朋友可能會疑惑了,這明明是個Button,是個View啊,咋成了Window?

剛才說過了,View是Window的表現形式,在實際實現中,添加window其實就是添加了一個你看不到的window,并且里面有View才能讓你感覺得到這個是一個Window。

所以通過windowManager添加的View其實就是添加Window的過程。

這其中還有兩個比較重要的屬性:flags和type,下面會依次說到。

Window怎樣可以顯示到鎖屏界面

Window的flag可以控制Window的顯示特性,也就是該怎么顯示、touch事件處理、與設備的關系、等等。所以這里問的鎖屏界面顯示也是其中的一種Flag。

  1. // Window不需要獲取焦點,也不接受各種輸入事件。 
  2. public static final int FLAG_NOT_FOCUSABLE = 0x00000008; 
  3.  
  4. // @deprecated Use {@link android.R.attr#showWhenLocked} or 
  5. // {@link android.app.Activity#setShowWhenLocked(boolean)} instead to prevent an 
  6. // unintentional double life-cycle event. 
  7.  
  8.  
  9. // 窗口可以在鎖屏的 Window 之上顯示 
  10. public static final int FLAG_SHOW_WHEN_LOCKED = 0x00080000; 

Window三種類型都存在的情況下,顯示層級是怎樣。

Type表示Window的類型,一共三種:

  • 應用Window。對應著一個Activity,Window層級為1~99,在視圖最下層。
  • 子Window。不能單獨存在,需要附屬在特定的父Window之中(如Dialog就是子Window),Window層級為1000~1999。
  • 系統Window。需要聲明權限才能創建的Window,比如Toast和系統狀態欄,Window層級為2000-2999,處在視圖最上層。

可以看到,區別就是有個Window層級(z-ordered),層級高的能覆蓋住層級低的,離用戶更近。

Window就是指PhoneWindow嗎?

如果有人問我這個問題,我肯定心里要大大的疑惑了??。

可不就是PhoneWindow嗎?都唯一實現類了,凈問些奇怪問題。

但是面試的時候遇到這種問題總要答啊?這時候就要扯出Window的概念了。

  • 如果指的Window類,那么PhoneWindow作為唯一實現類,一般指的就是PhoneWindow。
  • 如果指的Window這個概念,那肯定不是指PhoneWindow,而是存在于界面上真實的View。當然也不是所有的View都是Window,而是通過WindowManager添加到屏幕的view才是Window,所以PopupWindow是Window,上述問題中添加的單個View也是Window。

PhoneWindow什么時候被創建的?

熟悉Activity啟動流程的朋友應該知道,啟動過程會執行到ActivityThread的handleLaunchActivity方法,這里初始化了WindowManagerGlobal,也就是WindowManager實際操作Window的類,待會會看到:

  1. public Activity handleLaunchActivity(ActivityClientRecord r, 
  2.                                          PendingTransactionActions pendingActions, Intent customIntent) { 
  3.         //... 
  4.         WindowManagerGlobal.initialize(); 
  5.         //... 
  6.         final Activity a = performLaunchActivity(r, customIntent); 
  7.         //... 
  8.         return a; 
  9.     } 

然后會執行到performLaunchActivity中創建Activity,并調用attach方法進行一些數據的初始化(偽代碼):

  1. final void attach() { 
  2.      //初始化PhoneWindow 
  3.      mWindow = new PhoneWindow(this, window, activityConfigCallback); 
  4.      mWindow.setWindowControllerCallback(mWindowControllerCallback); 
  5.      mWindow.setCallback(this); 
  6.  
  7.      //和WindowManager關聯 
  8.      mWindow.setWindowManager( 
  9.              (WindowManager)context.getSystemService(Context.WINDOW_SERVICE), 
  10.              mToken, mComponent.flattenToString(), 
  11.              (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0); 
  12.  
  13.      mWindowManager = mWindow.getWindowManager(); 

可以看到,在Activity的attach方法中,創建了PhoneWindow,并且設置了callback,windowManager。

這里的callback待會會說到,跟事件分發有關系,可以說是當前Activity和PhoneWindow建立聯系。

要實現可以拖動的View該怎么做?

還是接著剛才的btn例子,如果要修改btn的位置,使用updateViewLayout即可,然后在ontouch方法中傳入移動的坐標即可。

  1. btn.setOnTouchListener { v, event -> 
  2.             val index = event.findPointerIndex(0) 
  3.             when (event.action) { 
  4.                 ACTION_MOVE -> { 
  5.                     windowParams.x = event.getRawX(index).toInt() 
  6.                     windowParams.y = event.getRawY(index).toInt() 
  7.                     windowManager.updateViewLayout(btn, windowParams) 
  8.                 } 
  9.                 else -> { 
  10.                 } 
  11.             } 
  12.             false 
  13.  
  14.         } 

Window的添加、刪除和更新過程。

Window的操作都是通過WindowManager來完成的,而WindowManager是一個接口,他的實現類是WindowManagerImpl,并且全部交給WindowManagerGlobal來處理。下面具體說下addView,updateViewLayout,和removeView。

1)addView

  1. //WindowManagerGlobal.java 
  2. public void addView(View view, ViewGroup.LayoutParams params, 
  3.             Display display, Window parentWindow) { 
  4.  
  5.         if (parentWindow != null) { 
  6.             parentWindow.adjustLayoutParamsForSubWindow(wparams); 
  7.         } 
  8.              
  9.             ViewRootImpl root; 
  10.             View panelParentView = null
  11.  
  12.             root = new ViewRootImpl(view.getContext(), display); 
  13.             view.setLayoutParams(wparams); 
  14.  
  15.             mViews.add(view); 
  16.             mRoots.add(root); 
  17.             mParams.add(wparams); 
  18.  
  19.             try { 
  20.                 root.setView(view, wparams, panelParentView); 
  21.             }  
  22.         } 
  23.     } 
  • 這里可以看到,創建了一個ViewRootImpl實例,這樣就說明了每個Window都對應著一個ViewRootImpl。
  • 然后通過add方法修改了WindowManagerGlobal中的一些參數,比如mViews—存儲了所有Window所對應的View,mRoots——所有Window所對應的ViewRootImpl,mParams—所有Window對應的布局參數。
  • 最后調用了ViewRootImpl的setView方法,繼續看看。
  1. final IWindowSession mWindowSession; 
  2.  
  3. mWindowSession = WindowManagerGlobal.getWindowSession(); 
  4.  
  5. public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) { 
  6.     // 
  7.     requestLayout(); 
  8.  
  9.     res = mWindowSession.addToDisplay(mWindow,); 

setView方法主要完成了兩件事,一是通過requestLayout方法完成異步刷新界面的請求,進行完整的view繪制流程。其次,會通過IWindowSession進行一次IPC調用,交給到WMS來實現Window的添加。

其中mWindowSession是一個Binder對象,相當于在客戶端的代理類,對應的服務端的實現為Session,而Session就是運行在SystemServer進程中,具體就是處于WMS服務中,最終就會調用到這個Session的addToDisplay方法,從方法名就可以猜到這個方法就是具體添加Window到屏幕的邏輯,具體就不分析了,下次說到屏幕繪制的時候再細談。

2)updateViewLayout

  1. public void updateViewLayout(View view, ViewGroup.LayoutParams params) { 
  2. /... 
  3.        final WindowManager.LayoutParams wparams = (WindowManager.LayoutParams)params; 
  4.  
  5.        view.setLayoutParams(wparams); 
  6.  
  7.        synchronized (mLock) { 
  8.            int index = findViewLocked(viewtrue); 
  9.            ViewRootImpl root = mRoots.get(index); 
  10.            mParams.remove(index); 
  11.            mParams.add(index, wparams); 
  12.            root.setLayoutParams(wparams, false); 
  13.        } 
  14.    } 

這里更新了WindowManager.LayoutParams和ViewRootImpl.LayoutParams,然后在ViewRootImpl內部同樣會重新對View進行繪制,最后通過IPC通信,調用到WMS的relayoutWindow完成更新。

3)removeView

  1. public void removeView(View view, boolean immediate) { 
  2.         if (view == null) { 
  3.             throw new IllegalArgumentException("view must not be null"); 
  4.         } 
  5.  
  6.         synchronized (mLock) { 
  7.             int index = findViewLocked(viewtrue); 
  8.             View curView = mRoots.get(index).getView(); 
  9.             removeViewLocked(index, immediate); 
  10.             if (curView == view) { 
  11.                 return
  12.             } 
  13.  
  14.             throw new IllegalStateException("Calling with view " + view 
  15.                     + " but the ViewAncestor is attached to " + curView); 
  16.         } 
  17.     } 
  18.      
  19.      
  20.     private void removeViewLocked(int index, boolean immediate) { 
  21.         ViewRootImpl root = mRoots.get(index); 
  22.         View view = root.getView(); 
  23.  
  24.         if (view != null) { 
  25.             InputMethodManager imm = view.getContext().getSystemService(InputMethodManager.class); 
  26.             if (imm != null) { 
  27.                 imm.windowDismissed(mViews.get(index).getWindowToken()); 
  28.             } 
  29.         } 
  30.         boolean deferred = root.die(immediate); 
  31.         if (view != null) { 
  32.             view.assignParent(null); 
  33.             if (deferred) { 
  34.                 mDyingViews.add(view); 
  35.             } 
  36.         } 
  37.     }     

該方法中,通過view找到mRoots中的對應索引,然后同樣走到ViewRootImpl中進行View刪除工作,通過die方法,最終走到dispatchDetachedFromWindow()方法中,主要做了以下幾件事:

  • 回調onDetachedFromeWindow。
  • 垃圾回收相關操作;
  • 通過Session的remove()在WMS中刪除Window;
  • 通過Choreographer移除監聽器

Activity、PhoneWindow、DecorView、ViewRootImpl 的關系?

看完上面的流程,我們再來理理這四個小伙伴之間的關系:

  • PhoneWindow 其實是 Window 的唯一子類,是 Activity 和 View 交互系統的中間層,用來管理View的,并且在Window創建(添加)的時候就新建了ViewRootImpl實例。
  • DecorView 是整個 View 層級的最頂層,ViewRootImpl是DecorView 的parent,但是他并不是一個真正的 View,只是繼承了ViewParent接口,用來掌管View的各種事件,包括requestLayout、invalidate、dispatchInputEvent 等等。

Window中的token是什么,有什么用?

token?又是個啥呢?剛才window操作過程中也沒出現啊。

token其實大家應該工作中會發現一點蹤跡,比如application的上下文去創建dialog的時候,就會報錯:

  1. unable to add window --token null 

所以這個token跟window操作是有關系的,翻到剛才的addview方法中,還有個細節我們沒說到,就是adjustLayoutParamsForSubWindow方法。

  1. //Window.java 
  2.     void adjustLayoutParamsForSubWindow(WindowManager.LayoutParams wp) { 
  3.         if (wp.type >= WindowManager.LayoutParams.FIRST_SUB_WINDOW && 
  4.                 wp.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW) { 
  5.             //子Window 
  6.             if (wp.token == null) { 
  7.                 View decor = peekDecorView(); 
  8.                 if (decor != null) { 
  9.                     wp.token = decor.getWindowToken(); 
  10.                 } 
  11.             } 
  12.         } else if (wp.type >= WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW && 
  13.                 wp.type <= WindowManager.LayoutParams.LAST_SYSTEM_WINDOW) { 
  14.             //系統Window 
  15.         } else { 
  16.             //應用Window 
  17.             if (wp.token == null) { 
  18.                 wp.token = mContainer == null ? mAppToken : mContainer.mAppToken; 
  19.             } 
  20.              
  21.         } 
  22.     } 

上述代碼分別代表了三個Window的類型:

  • 子Window。需要從decorview中拿到token。
  • 系統Window。不需要token。
  • 應用Window。直接拿mAppToken,mAppToken是在setWindowManager方法中傳進來的,也就是新建Window的時候就帶進來了token。

然后在WMS中的addWindow方法會驗證這個token,下次說到WMS的時候再看看。

所以這個token就是用來驗證是否能夠添加Window,可以理解為權限驗證,其實也就是為了防止開發者亂用context創建window。

擁有token的context(比如Activity)就可以操作Window。沒有token的上下文(比如Application)就不允許直接添加Window到屏幕(除了系統Window)。

Application中可以直接彈出Dialog嗎?

這個問題其實跟上述問題相關:

  • 如果直接使用Application的上下文是不能創建Window的,而Dialog的Window等級屬于子Window,必須依附與其他的父Window,所以必須傳入Activity這種有window的上下文。
  • 那有沒有其他辦法可以在Application中彈出dialog呢?有,改成系統級Window:
  1. //檢查權限 
  2. if (!Settings.canDrawOverlays(this)) { 
  3.     val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION) 
  4.     intent.data = Uri.parse("package:$packageName"
  5.     startActivityForResult(intent, 0) 
  6.  
  7. dialog.window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG) 
  8.  
  9. <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 

  • 另外還有一種辦法,在Application類中,可以通過registerActivityLifecycleCallbacks監聽Activity生命周期,不過這種辦法也是傳入了Activity的context,只不過在Application類中完成這個工作。

關于事件分發,事件到底是先到DecorView還是先到Window的?

經過上述一系列問題,是不是對Window印象又深了點呢?最后再看一個問題,這個是wanandroid論壇上看到的,

這里的window可以理解為PhoneWindow,其實這道題就是問事件分發在Activity、DecorView、PhoneWindow中的順序。

當屏幕被觸摸,首先會通過硬件產生觸摸事件傳入內核,然后走到FrameWork層(具體流程感興趣的可以看看參考鏈接),最后經過一系列事件處理到達ViewRootImpl的processPointerEvent方法,接下來就是我們要分析的內容了:

  1. //ViewRootImpl.java 
  2.  private int processPointerEvent(QueuedInputEvent q) { 
  3.             final MotionEvent event = (MotionEvent)q.mEvent; 
  4.             ... 
  5.             //mView分發Touch事件,mView就是DecorView 
  6.             boolean handled = mView.dispatchPointerEvent(event); 
  7.             ... 
  8.         } 
  9.  
  10. //DecorView.java 
  11.     public final boolean dispatchPointerEvent(MotionEvent event) { 
  12.         if (event.isTouchEvent()) { 
  13.             //分發Touch事件 
  14.             return dispatchTouchEvent(event); 
  15.         } else { 
  16.             return dispatchGenericMotionEvent(event); 
  17.         } 
  18.     } 
  19.  
  20.     @Override 
  21.     public boolean dispatchTouchEvent(MotionEvent ev) { 
  22.         //cb其實就是對應的Activity 
  23.         final Window.Callback cb = mWindow.getCallback(); 
  24.         return cb != null && !mWindow.isDestroyed() && mFeatureId < 0 
  25.                 ? cb.dispatchTouchEvent(ev) : super.dispatchTouchEvent(ev); 
  26.     } 
  27.  
  28.  
  29. //Activity.java 
  30.     public boolean dispatchTouchEvent(MotionEvent ev) { 
  31.         if (ev.getAction() == MotionEvent.ACTION_DOWN) { 
  32.             onUserInteraction(); 
  33.         } 
  34.         if (getWindow().superDispatchTouchEvent(ev)) { 
  35.             return true
  36.         } 
  37.         return onTouchEvent(ev); 
  38.     } 
  39.  
  40. //PhoneWindow.java 
  41.     @Override 
  42.     public boolean superDispatchTouchEvent(MotionEvent event) { 
  43.         return mDecor.superDispatchTouchEvent(event); 
  44.     } 
  45.  
  46. //DecorView.java 
  47.     public boolean superDispatchTouchEvent(MotionEvent event) { 
  48.         return super.dispatchTouchEvent(event); 
  49.     }     

事件的分發流程就比較清楚了:

ViewRootImpl——>DecorView——>Activity——>PhoneWindow——>DecorView——>ViewGroup

(這其中就用到了getCallback參數,也就是之前addView中傳入的callback,也就是Activity本身)

但是這個流程確實有些奇怪,為什么繞來繞去的呢,光DecorView就走了兩遍。

參考鏈接中的說法我還是比較認同的,主要原因就是解耦。

ViewRootImpl并不知道有Activity這種東西存在,它只是持有了DecorView。所以先傳給了DecorView,而DecorView知道有AC,所以傳給了AC。

Activity也不知道有DecorView,它只是持有PhoneWindow,所以這么一段調用鏈就形成了。

參考

《Android開發藝術探索》 《Android進階解密》 https://mp.weixin.qq.com/s/wy9V4wXUoEFZ6ekzuLJySQ https://blog.csdn.net/weixin_43766753/article/details/108350589 https://wanandroid.com/wenda/show/12119

 

責任編輯:武曉燕 來源: 碼上積木
相關推薦

2022-04-01 08:37:07

SpringAPI前端

2020-04-14 08:40:50

碼農bug編程

2021-07-21 09:15:27

MySQL數據庫面試

2021-08-27 14:14:39

ThreadLocal源碼操作

2022-01-24 14:08:16

Redis面試命令

2019-12-19 09:23:45

Java多線程數據

2021-07-30 16:16:54

網絡面試TCP

2011-10-24 22:17:56

SQL ServerDBA

2022-11-04 08:47:52

底層算法數據

2021-03-24 10:25:24

優化VUE性能

2021-02-02 08:21:28

網絡面試通信

2025-02-03 11:27:59

2020-09-02 07:00:42

ZooKeeper分布式

2009-03-19 19:04:44

2022-02-16 14:20:46

HashTableHashMap線程安全

2009-05-04 16:09:04

2012-05-29 10:18:05

組策略

2023-03-01 20:18:05

ChatGPTPython

2024-03-13 13:39:21

2016-03-02 15:13:54

面試開發者問題
點贊
收藏

51CTO技術棧公眾號

日本日本19xxxⅹhd乱影响| 57pao成人永久免费视频| 九一精品久久久| 香蕉久久aⅴ一区二区三区| av电影天堂一区二区在线| 午夜精品久久17c| 刘亦菲国产毛片bd| 激情视频极品美女日韩| 欧美亚洲动漫另类| 可以看毛片的网址| 免费人成在线观看网站| 国内一区二区视频| 国产91av在线| 69xx绿帽三人行| 精品无人区一区二区| 色综合 综合色| 日韩国产成人无码av毛片| 嫩草在线播放| 国产成人精品影院| 国产精品夜色7777狼人| 在线观看日韩中文字幕| 性xxxx视频| 超碰免费公开在线| www.亚洲人| 成人亲热视频网站| 亚洲不卡在线视频| 亚洲日韩视频| 欧美成人午夜视频| 国产白丝一区二区三区| 性人久久久久| 欧美成人vps| 性刺激的欧美三级视频| av日韩亚洲| 亚洲国产精品久久艾草纯爱| 一本—道久久a久久精品蜜桃| 深夜福利视频一区| 成人免费av资源| 亚洲 日韩 国产第一| 国产1区2区3区4区| 婷婷激情图片久久| 在线视频免费一区二区| 亚洲天堂网一区二区| 国产精品xxx在线观看| 欧美一卡在线观看| 五月天婷婷影视| 成人在线观看免费播放| 色屁屁一区二区| 欧美牲交a欧美牲交aⅴ免费真| 免费在线国产视频| 亚洲综合一区二区| 日本福利视频在线观看| 性国产高清在线观看| 亚洲欧美另类久久久精品2019| 亚洲欧美丝袜| 日本暖暖在线视频| 国产精品福利一区二区| 亚洲精品在线免费| 在线观看麻豆| 国产精品久久毛片a| 亚洲人一区二区| 91高清在线| 国产精品久久久久久久浪潮网站 | 免费黄色一级大片| 久久一区亚洲| 国产精品久久久久久av| 中文字幕一区二区三区人妻四季| 免费欧美日韩国产三级电影| 国产欧美日韩免费看aⅴ视频| 伊人久久亚洲综合| 国产在线精品一区二区夜色 | 精品久久久久久无码国产| 九九热线视频只有这里最精品| 在线观看国产精品网站| 波多野结衣xxxx| 免费一级欧美在线大片| 亚洲精品在线观看网站| www.自拍偷拍| 成人精品视频| 欧美理论片在线观看| 国产亚洲欧美精品久久久久久| 亚洲人成人一区二区三区| 欧美中文在线免费| 一本一道人人妻人人妻αv| 国产伦精品一区二区三区免费迷| caoporn国产精品免费公开| 偷拍精品一区二区三区| 国产精品天天摸av网| 蜜臀av.com| 性欧美又大又长又硬| 欧美色精品在线视频| 日本黄色三级网站| 亚洲伊人春色| 久久成人av网站| 日韩高清免费av| 蜜桃av一区二区在线观看| 99中文字幕| 国产精品久久久久一区二区国产| 亚洲视频在线一区二区| www.中文字幕在线| 成人在线精品| 亚洲欧美日韩图片| 全程偷拍露脸中年夫妇| 老鸭窝亚洲一区二区三区| 91手机视频在线观看| 婷婷婷国产在线视频| 亚洲免费观看高清完整| 欧美成人黑人猛交| 91精品尤物| 日日骚久久av| 天天综合网入口| 免费高清在线一区| 久久精品成人一区二区三区蜜臀| 一本一道波多野毛片中文在线| 亚洲一区二区高清| 在线免费视频一区| 亚洲警察之高压线| 欧美二区在线播放| 亚洲字幕av一区二区三区四区| 99久久国产免费看| 中文字幕色呦呦| 麻豆久久久久| 亚洲午夜国产成人av电影男同| 久草视频在线资源站| 蜜桃av一区二区三区| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 亚洲国产精品第一页| 水蜜桃精品av一区二区| 欧美亚洲日本黄色| 亚洲精品无amm毛片| 日韩一区欧美一区| 日本xxxx黄色| 国产欧美日韩免费观看| 5278欧美一区二区三区| 国产成人自拍一区| 亚洲综合一区在线| 九色91porny| 小小影院久久| 成人激情av在线| 在线观看麻豆| 欧美日本一道本在线视频| 黄色三级生活片| 日本视频免费一区| 日韩.欧美.亚洲| 台湾佬中文娱乐久久久| 国产午夜精品久久久| 在线观看免费国产视频| 成人97人人超碰人人99| 人人干视频在线| www国产精品| 欧美精品18videos性欧美| 国产999久久久| 亚洲精品欧美专区| xxxx视频在线观看| 精品91在线| 久久精品magnetxturnbtih| 中文在线免费视频| 亚洲欧洲免费视频| 波多野结衣在线观看视频| 国产亚洲欧美日韩俺去了| 丝袜制服一区二区三区| 日韩国产综合| 91久热免费在线视频| 菠萝菠萝蜜在线观看| 日韩欧美国产成人一区二区| 青青草偷拍视频| 成人av网址在线观看| 日韩欧美一区二| 国产欧美日韩视频在线| 国产精品视频久久久| 麻豆视频在线免费观看| 日韩免费一区二区| 亚洲黄色一区二区| 国产欧美日韩另类视频免费观看| 亚洲一级片网站| 中文字幕免费一区二区| 国产精品一区而去| 成人美女视频| 久久精品视频va| 亚洲av无码一区二区乱子伦| 黄色成人av网| 亚洲精品国产精品国自| 国产精品系列在线播放| 国产91在线免费| 成人在线电影在线观看视频| 亚洲综合色av| 中文字幕在线高清| 久久亚洲精品成人| 五月婷婷综合久久| 欧美乱妇23p| 日韩精品久久久久久久酒店| 欧美韩日一区二区三区四区| 99热这里只有精品2| 久久一区二区三区超碰国产精品| 异国色恋浪漫潭| 麻豆一区二区| 91精品久久久久久久久久另类| 中文字幕有码在线视频| 亚洲欧美www| av官网在线观看| 色婷婷久久久亚洲一区二区三区| 少妇aaaaa| 久久久久九九视频| 任你躁av一区二区三区| 日本亚洲免费观看| 黄色国产一级视频| 国产精品久久久乱弄| 久久国产一区| 亚州一区二区| 国产美女搞久久| 九色porny丨国产首页在线| zzjj国产精品一区二区| 亚洲欧美日韩综合在线| 日韩一级片在线观看| 91视频久久久| 欧美日韩裸体免费视频| 放荡的美妇在线播放| 中文字幕精品一区二区精品绿巨人 | 日韩在线观看不卡| 久久人91精品久久久久久不卡| 亚洲乱亚洲乱妇| 亚洲女人初尝黑人巨大| 少妇一级淫片免费看| 日韩小视频在线观看专区| 中文天堂在线播放| 色婷婷久久久综合中文字幕| 日韩欧美一区二区一幕| 伊人一区二区三区| 麻豆明星ai换脸视频| 欧美国产日韩亚洲一区| 野花社区视频在线观看| 99久久精品一区| 性活交片大全免费看| 国产精品69久久久久水密桃| 五月天av在线播放| 麻豆精品在线播放| 9久久婷婷国产综合精品性色| 久久人人精品| 女人另类性混交zo| 久久一区国产| 一级黄色香蕉视频| 日韩精品每日更新| 能在线观看的av网站| 日韩精品欧美成人高清一区二区| 熟女性饥渴一区二区三区| 国产欧美日本| 青青草原成人网| 亚洲一区免费| 国产精品亚洲二区在线观看 | 一区二区三区中文在线观看| 免费国产羞羞网站美图| 亚洲美女精品一区| 精品欧美一区二区久久久久| 樱花影视一区二区| 久久精品国产av一区二区三区| 亚洲一二三区不卡| 日本免费观看视| 色综合天天综合网国产成人综合天 | 国产乱理伦片a级在线观看| 亚洲欧洲午夜一线一品| 国产精品ⅴa有声小说| 视频直播国产精品| 国产超级va在线视频| 欧美日韩不卡合集视频| av剧情在线观看| 欧美在线视频a| 精品三区视频| 亚洲xxxxx性| 成人资源在线| 欧美三日本三级少妇三99| 久久人人99| 欧美乱做爰xxxⅹ久久久| 99精品久久| 天天操天天爱天天爽| 国产一区二区三区免费| 完美搭档在线观看| 国产免费成人在线视频| 午夜爽爽爽男女免费观看| 午夜日韩在线电影| 成人a v视频| 欧美一区二区视频免费观看| 人妻一区二区三区免费| 夜夜嗨av一区二区三区免费区| 欧美成人性生活视频| 久久男人av资源网站| 精品3atv在线视频| 亚洲综合视频1区| 蜜桃一区二区| 国产日产欧美一区二区| 亚洲视频1区| 天天干天天色天天干| 99久久国产免费看| 成人免费黄色小视频| 五月婷婷激情综合网| 一本久道久久综合无码中文| 亚洲福利在线视频| 91官网在线| 2019亚洲男人天堂| **国产精品| 欧美福利精品| 欧美区一区二| 在线观看免费成人av| 大桥未久av一区二区三区中文| av网在线播放| 亚洲h在线观看| 国产乱淫片视频| 亚洲偷熟乱区亚洲香蕉av| 婷婷在线播放| 国产精自产拍久久久久久| 久久男人av| 久久免费一级片| 欧美a一区二区| 亚洲最大免费视频| 亚洲欧美日韩人成在线播放| 男人天堂av在线播放| 亚洲成人性视频| 成人福利网站| 国产精品美乳在线观看| 猫咪成人在线观看| 欧美国产日韩激情| 国产综合久久久久影院| 亚洲图片另类小说| 五月天中文字幕一区二区| 国产麻豆免费视频| 正在播放国产一区| 亚洲成人看片| 蜜桃在线一区二区三区精品| 亚洲高清电影| 久久久国产精品久久久| 中文字幕在线一区免费| 国产成人麻豆免费观看| 国产午夜精品麻豆| 亚洲优女在线| 欧美日韩另类综合| 欧美亚洲专区| 六月婷婷七月丁香| 午夜视频一区二区| 午夜小视频免费| 久久男人资源视频| 欧美精品中文| 日韩在线综合网| 91在线免费视频观看| 日韩欧美a级片| 日韩av在线免费看| 深夜成人在线| 欧美精品一区二区三区久久| 亚洲欧美日韩精品一区二区 | 国产精品盗摄一区二区三区| 欧美 亚洲 另类 激情 另类| 亚洲最新av在线网站| 精品国产欧美日韩一区二区三区| 欧美在线激情| 蜜桃传媒麻豆第一区在线观看| 林心如三级全黄裸体| 欧美日韩国产片| 亚洲七七久久综合桃花剧情介绍| 91成人免费观看| 欧美另类亚洲| 男男做爰猛烈叫床爽爽小说 | 中文字幕在线观看精品| 中文字幕久热精品视频在线| 欧美男女视频| 国产精品igao激情视频| 成人福利在线看| 69视频免费在线观看| 亚洲色图美腿丝袜| 欧美日韩伦理一区二区| 欧美日韩午夜爽爽| 成人动漫精品一区二区| 成人毛片在线播放| 色先锋资源久久综合5566| 国产精品3区| 美脚丝袜脚交一区二区| 国产亚洲一区字幕| 97超碰人人草| 久久久久免费视频| 国产精品美女久久久久久不卡| 黄大色黄女片18第一次| 亚洲国产视频网站| 免费一级在线观看| 亚洲a区在线视频| av成人毛片| jizzjizz日本少妇| 亚洲成人xxx| 123成人网| 免费人成在线观看视频播放| 91免费视频观看| 国产精品久久久久精| 国外成人性视频| 91亚洲国产| 亚洲 欧美 日韩在线| 欧美三片在线视频观看| 日韩欧美一起| 亚洲精品乱码久久久久久蜜桃91| 国产精品伊人色| 中文字幕日韩免费| 欧美激情精品久久久久| 精品日本12videosex| 香蕉视频免费网站| 欧美天天综合网| 女人高潮被爽到呻吟在线观看 |