3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析

發(fā)布時間:2023/12/15 Android 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【工匠若水 http://blog.csdn.net/yanbober 轉(zhuǎn)載煩請注明出處。尊重勞動成果】

1 背景

之所以寫這一篇博客的原因是由于之前有寫過一篇《Android應(yīng)用setContentView與LayoutInflater載入解析機制源代碼分析》。然后有人在文章以下評論和微博私信中問我關(guān)于Android應(yīng)用Activity、Dialog、PopWindow載入顯示機制是咋回事,所以我就寫一篇文章來分析分析吧(本文以Android5.1.1 (API 22)源代碼為基礎(chǔ)分析),以便大家在應(yīng)用層開發(fā)時不再迷糊。

PS一句:不僅有人微博私信我這個問題,還有人問博客插圖這些是用啥畫的,這里告訴大家。就是我,快來猛戳我

還記得之前《Android應(yīng)用setContentView與LayoutInflater載入解析機制源代碼分析》這篇文章的最后分析結(jié)果嗎?就是例如以下這幅圖:

在那篇文章里我們當(dāng)時重點是Activity的View載入解析xml機制分析,當(dāng)時說到了Window的東西,但僅僅是皮毛的分析了Activity相關(guān)的一些邏輯。(PS:看到這不清楚上面啥意思的建議先移步到《Android應(yīng)用setContentView與LayoutInflater載入解析機制源代碼分析》,完事再回頭繼續(xù)看這篇文章。)當(dāng)時給大家承諾過我們要從應(yīng)用控件一點一點往下慢慢深入分析,所以如今開始深入,可是本篇的深入也僅僅是僅限Window相關(guān)的東東。之后文章還會繼續(xù)慢慢深入。

【工匠若水 http://blog.csdn.net/yanbober 轉(zhuǎn)載煩請注明出處。尊重勞動成果】

2 淺析Window與WindowManager相關(guān)關(guān)系及源代碼

通過上面那幅圖能夠非常直觀的看見,Android屏幕顯示的就是Window和各種View,Activity在當(dāng)中的作用主要是管理生命周期、建立窗體等。也就是說Window相關(guān)的東西對于Android屏幕來說是至關(guān)重要的(盡管前面分析Activity的setContentView等原理時說過一點Window。但那僅僅是皮毛。),所以有必要在分析Android應(yīng)用Activity、Dialog、PopWindow載入顯示機制前再看看Window相關(guān)的一些東西。

2-1 Window與WindowManager基礎(chǔ)關(guān)系

在分析Window與WindowManager之前我們先看一張圖:

接下來看一點代碼,例如以下:

/** Interface to let you add and remove child views to an Activity. To get an instance* of this class, call {@link android.content.Context#getSystemService(java.lang.String) Context.getSystemService()}.*/ public interface ViewManager {public void addView(View view, ViewGroup.LayoutParams params);public void updateViewLayout(View view, ViewGroup.LayoutParams params);public void removeView(View view); }

能夠看見,ViewManager接口定義了一組規(guī)則。也就是add、update、remove的操作View接口。也就是說ViewManager是用來加入和移除activity中View的接口。

繼續(xù)往下看:

public interface WindowManager extends ViewManager {......public Display getDefaultDisplay();public void removeViewImmediate(View view);......public static class LayoutParams extends ViewGroup.LayoutParamsimplements Parcelable {......} }

看見沒有。WindowManager繼承自ViewManager,然后自己還是一個接口,同一時候又定義了一個靜態(tài)內(nèi)部類LayoutParams(這個類比較重要。后面會分析。提前透漏下。假設(shè)你在APP做過相似360助手屏幕的那個懸浮窗或者做過那種相似IOS的小白圓點,點擊展開菜單功能,你或多或少就能猜到這個類的重要性。)。

WindowManager用來在應(yīng)用與Window之間的接口、窗體順序、消息等的管理。繼續(xù)看下ViewManager的還有一個實現(xiàn)子類ViewGroup。例如以下:

public abstract class ViewGroup extends View implements ViewParent, ViewManager {//protected ViewParent mParent;//這個成員是View定義的,ViewGroup繼承自View,所以也能夠擁有。//這個變量就是前面我們一系列文章分析View向上傳遞的父節(jié)點,相似于一個鏈表Node的next一樣//終于指向了ViewRoot......public void addView(View child, LayoutParams params) {addView(child, -1, params);}......public void addView(View child, int index, LayoutParams params) {......// addViewInner() will call child.requestLayout() when setting the new LayoutParams// therefore, we call requestLayout() on ourselves before, so that the child's request// will be blocked at our levelrequestLayout();invalidate(true);addViewInner(child, index, params, false);}...... }

這下理解上面那幅圖了吧,所以說View通過ViewGroup的addView方法加入到ViewGroup中。而ViewGroup層層嵌套到最頂級都會顯示在在一個窗體Window中(正如上面背景介紹中《Android應(yīng)用setContentView與LayoutInflater載入解析機制源代碼分析》的示意圖一樣)。當(dāng)中每一個View都有一個ViewParent類型的父節(jié)點mParent,最頂上的節(jié)點也是一個viewGroup,也即前面文章分析的Window的內(nèi)部類DecorView(從《Android應(yīng)用setContentView與LayoutInflater載入解析機制源代碼分析》的總結(jié)部分或者《Android應(yīng)用層View繪制流程與源代碼分析》的5-1小節(jié)都能夠驗證這個結(jié)論)對象。同一時候通過上面背景中那幅圖能夠看出來。對于一個Activity僅僅有一個DecorView(ViewRoot)。也僅僅有一個Window。

2-2 Activity窗體加入流程拓展

前面文章說過。ActivityThread類的performLaunchActivity方法中調(diào)運了activity.attach(…)方法進行初始化。例如以下是Activity的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) {......//創(chuàng)建Window類型的mWindow對象。實際為PhoneWindow類實現(xiàn)了抽象Window類mWindow = PolicyManager.makeNewWindow(this);......//通過抽象Window類的setWindowManager方法給Window類的成員變量WindowManager賦值實例化mWindow.setWindowManager((WindowManager)context.getSystemService(Context.WINDOW_SERVICE),mToken, mComponent.flattenToString(),(info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);......//把抽象Window類相關(guān)的WindowManager對象拿出來關(guān)聯(lián)到Activity的WindowManager類型成員變量mWindowManagermWindowManager = mWindow.getWindowManager();......}

看見沒有。Activity類中的attach方法又創(chuàng)建了Window類型的新成員變量mWindow(PhoneWindow實現(xiàn)類)與Activity相關(guān)聯(lián),接著在Activity類的attach方法最后又通過mWindow.setWindowManager(…)方法創(chuàng)建了與Window相關(guān)聯(lián)的WindowManager對象,最后又通過mWindow.getWindowManager()將Window的WindowManager成員變量賦值給Activity的WindowManager成員變量mWindowManager。

接下來我們看下上面代碼中的mWindow.setWindowManager(…)方法源代碼(PhoneWindow沒有重寫抽象Window的setWindowManager方法,所以直接看Window類的該方法源代碼),例如以下:

public void setWindowManager(WindowManager wm, IBinder appToken, String appName,boolean hardwareAccelerated) {......if (wm == null) {wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);}//實例化Window類的WindowManager類型成員mWindowManagermWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);}

能夠看見,Window的setWindowManager方法中通過WindowManagerImpl實例的createLocalWindowManager方法獲取了WindowManager實例。例如以下:

public final class WindowManagerImpl implements WindowManager {......private WindowManagerImpl(Display display, Window parentWindow) {mDisplay = display;mParentWindow = parentWindow;}......public WindowManagerImpl createLocalWindowManager(Window parentWindow) {return new WindowManagerImpl(mDisplay, parentWindow);}...... }

看見沒有?這樣就把Activity的Window與WindowManager關(guān)聯(lián)起來了。Activity類的Window類型成員變量mWindow及WindowManager類型成員變量mWindowManager就是這么來的。

回過頭繼續(xù)看上面剛剛貼的Activity的attach方法代碼,看見mWindow.setWindowManager方法傳遞的第一個參數(shù)沒?有人會想(WindowManager)context.getSystemService(Context.WINDOW_SERVICE)這行代碼是什么意思。如今告訴你。

《Android應(yīng)用Context具體解釋及源代碼解析》一文中第三部分以前說過ActivityThread中創(chuàng)建了Acitivty(運行attach等方法)等東東,在創(chuàng)建這個Activity之前得到了Context的實例。

記不記得當(dāng)時說Context的實現(xiàn)類就是ContextImpl嗎?以下我們看下ContextImpl類的靜態(tài)方法塊,例如以下:

class ContextImpl extends Context {......//靜態(tài)代碼塊。類載入時運行一次static {......//這里有一堆相似的XXX_SERVICE的注冊......registerService(WINDOW_SERVICE, new ServiceFetcher() {Display mDefaultDisplay;public Object getService(ContextImpl ctx) {//搞一個Display實例Display display = ctx.mDisplay;if (display == null) {if (mDefaultDisplay == null) {DisplayManager dm = (DisplayManager)ctx.getOuterContext().getSystemService(Context.DISPLAY_SERVICE);mDefaultDisplay = dm.getDisplay(Display.DEFAULT_DISPLAY);}display = mDefaultDisplay;}//返回一個WindowManagerImpl實例return new WindowManagerImpl(display);}});......}//這就是你在外面調(diào)運Context的getSystemService獲取到的WindowManagerImpl實例@Overridepublic Object getSystemService(String name) {ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);return fetcher == null ? null : fetcher.getService(this);}//上面static代碼塊創(chuàng)建WindowManagerImpl實例用到的方法private static void registerService(String serviceName, ServiceFetcher fetcher) {if (!(fetcher instanceof StaticServiceFetcher)) {fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;}SYSTEM_SERVICE_MAP.put(serviceName, fetcher);} }

看見沒有,我們都知道Java的靜態(tài)代碼塊是類載入是運行一次的。也就相當(dāng)于一個全局的,這樣就相當(dāng)于每一個Application僅僅有一個WindowManagerImpl(display)實例。

還記不記得《Android應(yīng)用setContentView與LayoutInflater載入解析機制源代碼分析》一文2-6小節(jié)中說的,setContentView的實質(zhì)顯示是觸發(fā)了Activity的resume狀態(tài)。也就是觸發(fā)了makeVisible方法。那我們再來看下這種方法。例如以下:

void makeVisible() {if (!mWindowAdded) {//也就是獲取Activity的mWindowManager//這個mWindowManager是在Activity的attach中通過mWindow.getWindowManager()獲得ViewManager wm = getWindowManager();//調(diào)運的實質(zhì)就是ViewManager接口的addView方法,傳入的是mDecorViewwm.addView(mDecor, getWindow().getAttributes());mWindowAdded = true;}mDecor.setVisibility(View.VISIBLE);}

特別注意,看見makeVisible方法的wm變量沒。這個變量就是Window類中通過調(diào)運WindowManagerImpl的createLocalWindowManager創(chuàng)建的實例,也就是說每一個Activity都會新創(chuàng)建這么一個WindowManager實例來顯示Activity的界面的,有點和上面分析的ContextImpl中static塊創(chuàng)建的WindowManager不太一樣的地方就在于Context的WindowManager對每一個APP來說是一個全局單例的,而Activity的WindowManager是每一個Activity都會新創(chuàng)建一個的(事實上你從上面分析的兩個實例化WindowManagerImpl的構(gòu)造函數(shù)參數(shù)傳遞就能夠看出來,Activity中Window的WindowManager成員在構(gòu)造實例化時傳入給WindowManagerImpl中mParentWindow成員的是當(dāng)前Window對象,而ContextImpl的static塊中單例實例化WindowManagerImpl時傳入給WindowManagerImpl中mParentWindow成員的是null值)。

繼續(xù)看makeVisible中調(diào)運的WindowManagerImpl的addView方法例如以下:

public final class WindowManagerImpl implements WindowManager {//繼承自O(shè)bject的單例類private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();......public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {applyDefaultToken(params);//mParentWindow是上面分析的在Activity中獲取WindowManagerImpl實例化時傳入的當(dāng)前Window//view是Activity中最頂層的mDecormGlobal.addView(view, params, mDisplay, mParentWindow);}...... }

這里當(dāng)前傳入的view是mDecor。LayoutParams呢?能夠看見是getWindow().getAttributes()。那我們進去看看Window類的這個屬性。例如以下:

// The current window attributes.private final WindowManager.LayoutParams mWindowAttributes = new WindowManager.LayoutParams();

原來是WindowManager的靜態(tài)內(nèi)部類LayoutParams的默認構(gòu)造函數(shù):

public LayoutParams() {super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);type = TYPE_APPLICATION;format = PixelFormat.OPAQUE; }

看見沒有。Activity窗體的WindowManager.LayoutParams類型是TYPE_APPLICATION的。

繼續(xù)回到WindowManagerImpl的addView方法。分析能夠看見WindowManagerImpl中有一個單例模式的WindowManagerGlobal成員mGlobal。addView終于調(diào)運了WindowManagerGlobal的addView,源代碼例如以下:

public final class WindowManagerGlobal {......private final ArrayList<View> mViews = new ArrayList<View>();private final ArrayList<ViewRootImpl> mRoots = new ArrayList<ViewRootImpl>();private final ArrayList<WindowManager.LayoutParams> mParams =new ArrayList<WindowManager.LayoutParams>();private final ArraySet<View> mDyingViews = new ArraySet<View>();......public void addView(View view, ViewGroup.LayoutParams params,Display display, Window parentWindow) {......//獲取Activity的Window的getWindow().getAttributes()的LayoutParams final WindowManager.LayoutParams wparams = (WindowManager.LayoutParams)params;//假設(shè)是Activity中調(diào)運的,parentWindow=Window。假設(shè)不是Activity的。譬如是Context的靜態(tài)代碼塊的實例化則parentWindow為nullif (parentWindow != null) {//根據(jù)當(dāng)前Activity的Window調(diào)節(jié)sub Window的LayoutParamsparentWindow.adjustLayoutParamsForSubWindow(wparams);} else {......}ViewRootImpl root;......synchronized (mLock) {......//為當(dāng)前Window創(chuàng)建ViewRootroot = new ViewRootImpl(view.getContext(), display);view.setLayoutParams(wparams);//把當(dāng)前Window相關(guān)的東西存入各自的List中,在remove中會刪掉mViews.add(view);mRoots.add(root);mParams.add(wparams);}// do this last because it fires off messages to start doing thingstry {//把View和ViewRoot關(guān)聯(lián)起來。非常重要!!!

root.setView(view, wparams, panelParentView); } catch (RuntimeException e) { ...... } } ...... }

能夠看見,在addView方法中會利用LayoutParams獲得Window的屬性,然后為每一個Window創(chuàng)建ViewRootImpl。最后通過ViewRootImpl的setView方法通過mSession向WindowManagerService發(fā)送加入窗體請求把窗體加入到WindowManager中。并且由WindowManager來管理窗體的view、事件、消息收集處理等(ViewRootImpl的這一加入過程后面會寫文章分析,這里先記住這個概念就可以)。

至此我們對上面背景中那幅圖,也就是《Android應(yīng)用setContentView與LayoutInflater載入解析機制源代碼分析》這篇文章總結(jié)部分的那幅圖又進行了更深入的一點分析。其目的也就是為了以下分析Android應(yīng)用Dialog、PopWindow、Toast載入顯示機制做鋪墊準備。

2-3 繼續(xù)順藤摸瓜WindowManager.LayoutParams類的源代碼

上面2-1分析Window與WindowManager基礎(chǔ)關(guān)系時提到了WindowManager有一個靜態(tài)內(nèi)部類LayoutParams。它繼承于ViewGroup.LayoutParams。用于向WindowManager描寫敘述Window的管理策略。如今我們來看下這個類(PS:在AD上也能夠看見,自備梯子點我看AD的),例如以下:

public static class LayoutParams extends ViewGroup.LayoutParamsimplements Parcelable {//窗體的絕對XY位置,須要考慮gravity屬性public int x;public int y;//在橫縱方向上為相關(guān)的View預(yù)留多少擴展像素。假設(shè)是0則此view不能被拉伸。其它情況下擴展像素被widget均分public float horizontalWeight;public float verticalWeight;//窗體類型//有3種主要類型例如以下://ApplicationWindows取值在FIRST_APPLICATION_WINDOW與LAST_APPLICATION_WINDOW之間,是經(jīng)常使用的頂層應(yīng)用程序窗體,須將token設(shè)置成Activity的token;//SubWindows取值在FIRST_SUB_WINDOW和LAST_SUB_WINDOW之間,與頂層窗體相關(guān)聯(lián)。需將token設(shè)置成它所附著宿主窗體的token。//SystemWindows取值在FIRST_SYSTEM_WINDOW和LAST_SYSTEM_WINDOW之間,不能用于應(yīng)用程序。使用時須要有特殊權(quán)限。它是特定的系統(tǒng)功能才干使用;public int type;//WindowType:開始應(yīng)用程序窗體public static final int FIRST_APPLICATION_WINDOW = 1;//WindowType:全部程序窗體的base窗體,其它應(yīng)用程序窗體都顯示在它上面public static final int TYPE_BASE_APPLICATION = 1;//WindowType:普通應(yīng)用程序窗體,token必須設(shè)置為Activity的token來指定窗體屬于誰public static final int TYPE_APPLICATION = 2;//WindowType:應(yīng)用程序啟動時所顯示的窗體,應(yīng)用自己不要使用這樣的類型,它被系統(tǒng)用來顯示一些信息,直到應(yīng)用程序能夠開啟自己的窗體為止public static final int TYPE_APPLICATION_STARTING = 3;//WindowType:結(jié)束應(yīng)用程序窗體public static final int LAST_APPLICATION_WINDOW = 99;//WindowType:SubWindows子窗體。子窗體的Z序和坐標空間都依賴于他們的宿主窗體public static final int FIRST_SUB_WINDOW = 1000;//WindowType: 面板窗體。顯示于宿主窗體的上層public static final int TYPE_APPLICATION_PANEL = FIRST_SUB_WINDOW;//WindowType:媒體窗體(比如視頻)。顯示于宿主窗體下層public static final int TYPE_APPLICATION_MEDIA = FIRST_SUB_WINDOW+1;//WindowType:應(yīng)用程序窗體的子面板。顯示于全部面板窗體的上層public static final int TYPE_APPLICATION_SUB_PANEL = FIRST_SUB_WINDOW+2;//WindowType:對話框,相似于面板窗體,繪制相似于頂層窗體,而不是宿主的子窗體public static final int TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW+3;//WindowType:媒體信息。顯示在媒體層和程序窗體之間。須要實現(xiàn)半透明效果public static final int TYPE_APPLICATION_MEDIA_OVERLAY = FIRST_SUB_WINDOW+4;//WindowType:子窗體結(jié)束public static final int LAST_SUB_WINDOW = 1999;//WindowType:系統(tǒng)窗體,非應(yīng)用程序創(chuàng)建public static final int FIRST_SYSTEM_WINDOW = 2000;//WindowType:狀態(tài)欄,僅僅能有一個狀態(tài)欄。位于屏幕頂端,其它窗體都位于它下方public static final int TYPE_STATUS_BAR = FIRST_SYSTEM_WINDOW;//WindowType:搜索欄。僅僅能有一個搜索欄,位于屏幕上方public static final int TYPE_SEARCH_BAR = FIRST_SYSTEM_WINDOW+1;//WindowType:電話窗體,它用于電話交互(特別是呼入),置于全部應(yīng)用程序之上,狀態(tài)欄之下public static final int TYPE_PHONE = FIRST_SYSTEM_WINDOW+2;//WindowType:系統(tǒng)提示,出如今應(yīng)用程序窗體之上public static final int TYPE_SYSTEM_ALERT = FIRST_SYSTEM_WINDOW+3;//WindowType:鎖屏窗體public static final int TYPE_KEYGUARD = FIRST_SYSTEM_WINDOW+4;//WindowType:信息窗體。用于顯示Toastpublic static final int TYPE_TOAST = FIRST_SYSTEM_WINDOW+5;//WindowType:系統(tǒng)頂層窗體。顯示在其它一切內(nèi)容之上,此窗體不能獲得輸入焦點。否則影響鎖屏public static final int TYPE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW+6;//WindowType:電話優(yōu)先,當(dāng)鎖屏?xí)r顯示,此窗體不能獲得輸入焦點,否則影響鎖屏public static final int TYPE_PRIORITY_PHONE = FIRST_SYSTEM_WINDOW+7;//WindowType:系統(tǒng)對話框public static final int TYPE_SYSTEM_DIALOG = FIRST_SYSTEM_WINDOW+8;//WindowType:鎖屏?xí)r顯示的對話框public static final int TYPE_KEYGUARD_DIALOG = FIRST_SYSTEM_WINDOW+9;//WindowType:系統(tǒng)內(nèi)部錯誤提示,顯示于全部內(nèi)容之上public static final int TYPE_SYSTEM_ERROR = FIRST_SYSTEM_WINDOW+10;//WindowType:內(nèi)部輸入法窗體,顯示于普通UI之上,應(yīng)用程序可又一次布局以免被此窗體覆蓋public static final int TYPE_INPUT_METHOD = FIRST_SYSTEM_WINDOW+11;//WindowType:內(nèi)部輸入法對話框。顯示于當(dāng)前輸入法窗體之上public static final int TYPE_INPUT_METHOD_DIALOG= FIRST_SYSTEM_WINDOW+12;//WindowType:墻紙窗體public static final int TYPE_WALLPAPER = FIRST_SYSTEM_WINDOW+13;//WindowType:狀態(tài)欄的滑動面板public static final int TYPE_STATUS_BAR_PANEL = FIRST_SYSTEM_WINDOW+14;//WindowType:安全系統(tǒng)覆蓋窗體。這些窗戶必須不帶輸入焦點。否則會干擾鍵盤public static final int TYPE_SECURE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW+15;//WindowType:拖放偽窗體,僅僅有一個阻力層(最多),它被放置在全部其它窗體上面public static final int TYPE_DRAG = FIRST_SYSTEM_WINDOW+16;//WindowType:狀態(tài)欄下拉面板public static final int TYPE_STATUS_BAR_SUB_PANEL = FIRST_SYSTEM_WINDOW+17;//WindowType:鼠標指針public static final int TYPE_POINTER = FIRST_SYSTEM_WINDOW+18;//WindowType:導(dǎo)航欄(有別于狀態(tài)欄時)public static final int TYPE_NAVIGATION_BAR = FIRST_SYSTEM_WINDOW+19;//WindowType:音量級別的覆蓋對話框。顯示當(dāng)用戶更改系統(tǒng)音量大小public static final int TYPE_VOLUME_OVERLAY = FIRST_SYSTEM_WINDOW+20;//WindowType:起機進度框,在一切之上public static final int TYPE_BOOT_PROGRESS = FIRST_SYSTEM_WINDOW+21;//WindowType:假窗,消費導(dǎo)航欄隱藏時觸摸事件public static final int TYPE_HIDDEN_NAV_CONSUMER = FIRST_SYSTEM_WINDOW+22;//WindowType:夢想(屏保)窗體,略高于鍵盤public static final int TYPE_DREAM = FIRST_SYSTEM_WINDOW+23;//WindowType:導(dǎo)航欄面板(不同于狀態(tài)欄的導(dǎo)航欄)public static final int TYPE_NAVIGATION_BAR_PANEL = FIRST_SYSTEM_WINDOW+24;//WindowType:universe背后真正的窗戶public static final int TYPE_UNIVERSE_BACKGROUND = FIRST_SYSTEM_WINDOW+25;//WindowType:顯示窗體覆蓋,用于模擬輔助顯示設(shè)備public static final int TYPE_DISPLAY_OVERLAY = FIRST_SYSTEM_WINDOW+26;//WindowType:放大窗體覆蓋。用于突出顯示的放大部分可訪問性放大時啟用public static final int TYPE_MAGNIFICATION_OVERLAY = FIRST_SYSTEM_WINDOW+27;//WindowType:......public static final int TYPE_KEYGUARD_SCRIM = FIRST_SYSTEM_WINDOW+29;public static final int TYPE_PRIVATE_PRESENTATION = FIRST_SYSTEM_WINDOW+30;public static final int TYPE_VOICE_INTERACTION = FIRST_SYSTEM_WINDOW+31;public static final int TYPE_ACCESSIBILITY_OVERLAY = FIRST_SYSTEM_WINDOW+32;//WindowType:系統(tǒng)窗體結(jié)束public static final int LAST_SYSTEM_WINDOW = 2999;//MemoryType:窗體緩沖位于主內(nèi)存public static final int MEMORY_TYPE_NORMAL = 0;//MemoryType:窗體緩沖位于能夠被DMA訪問,或者硬件加速的內(nèi)存區(qū)域public static final int MEMORY_TYPE_HARDWARE = 1;//MemoryType:窗體緩沖位于可被圖形加速器訪問的區(qū)域public static final int MEMORY_TYPE_GPU = 2;//MemoryType:窗體緩沖不擁有自己的緩沖區(qū),不能被鎖定,緩沖區(qū)由本地方法提供public static final int MEMORY_TYPE_PUSH_BUFFERS = 3;//指出窗體所使用的內(nèi)存緩沖類型,默覺得NORMAL public int memoryType;//Flag:當(dāng)該window對用戶可見的時候。同意鎖屏public static final int FLAG_ALLOW_LOCK_WHILE_SCREEN_ON = 0x00000001;//Flag:讓該window后全部的東西都成暗淡public static final int FLAG_DIM_BEHIND = 0x00000002;//Flag:讓該window后全部東西都模糊(4.0以上已經(jīng)放棄這樣的毛玻璃效果)public static final int FLAG_BLUR_BEHIND = 0x00000004;//Flag:讓window不能獲得焦點,這樣用戶快就不能向該window發(fā)送按鍵事public static final int FLAG_NOT_FOCUSABLE = 0x00000008;//Flag:讓該window不接受觸摸屏事件public static final int FLAG_NOT_TOUCHABLE = 0x00000010;//Flag:即使在該window在可獲得焦點情況下,依然把該window之外的不論什么event發(fā)送到該window之后的其它windowpublic static final int FLAG_NOT_TOUCH_MODAL = 0x00000020;//Flag:當(dāng)手機處于睡眠狀態(tài)時,假設(shè)屏幕被按下。那么該window將第一個收到public static final int FLAG_TOUCHABLE_WHEN_WAKING = 0x00000040;//Flag:當(dāng)該window對用戶可見時,讓設(shè)備屏幕處于高亮(bright)狀態(tài)public static final int FLAG_KEEP_SCREEN_ON = 0x00000080;//Flag:讓window占滿整個手機屏幕。不留不論什么邊界public static final int FLAG_LAYOUT_IN_SCREEN = 0x00000100;//Flag:window大小不再不受手機屏幕限制大小,即window可能超出屏幕之外public static final int FLAG_LAYOUT_NO_LIMITS = 0x00000200;//Flag:window全屏顯示public static final int FLAG_FULLSCREEN = 0x00000400;//Flag:恢復(fù)window非全屏顯示public static final int FLAG_FORCE_NOT_FULLSCREEN = 0x00000800;//Flag:開啟抖動(dithering)public static final int FLAG_DITHER = 0x00001000;//Flag:當(dāng)該window在進行顯示的時候,不同意截屏public static final int FLAG_SECURE = 0x00002000;//Flag:一個特殊模式的布局參數(shù)用于運行擴展表面合成時到屏幕上public static final int FLAG_SCALED = 0x00004000;//Flag:用于windows時,經(jīng)常會使用屏幕用戶持有反對他們的臉,它將積極過濾事件流,以防止意外按在這樣的情況下,可能不須要為特定的窗體,在檢測到這樣一個事件流時,應(yīng)用程序?qū)⒔邮杖∠\動事件表明,這樣應(yīng)用程序能夠處理這相應(yīng)地採取不論什么行動的事件,直到手指釋放public static final int FLAG_IGNORE_CHEEK_PRESSES = 0x00008000;//Flag:一個特殊的選項僅僅用于結(jié)合FLAG_LAYOUT_IN_SCpublic static final int FLAG_LAYOUT_INSET_DECOR = 0x00010000;//Flag:轉(zhuǎn)化的狀態(tài)FLAG_NOT_FOCUSABLE對這個窗體當(dāng)前怎樣進行交互的方法public static final int FLAG_ALT_FOCUSABLE_IM = 0x00020000;//Flag:假設(shè)你設(shè)置了該flag,那么在你FLAG_NOT_TOUNCH_MODAL的情況下。即使觸摸屏事件發(fā)送在該window之外。其事件被發(fā)送到了后面的window,那么該window仍然將以MotionEvent.ACTION_OUTSIDE形式收到該觸摸屏事件public static final int FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000;//Flag:當(dāng)鎖屏的時候,顯示該windowpublic static final int FLAG_SHOW_WHEN_LOCKED = 0x00080000;//Flag:在該window后顯示系統(tǒng)的墻紙public static final int FLAG_SHOW_WALLPAPER = 0x00100000;//Flag:當(dāng)window被顯示的時候,系統(tǒng)將把它當(dāng)做一個用戶活動事件,以點亮手機屏幕public static final int FLAG_TURN_SCREEN_ON = 0x00200000;//Flag:消失鍵盤public static final int FLAG_DISMISS_KEYGUARD = 0x00400000;//Flag:當(dāng)該window在能夠接受觸摸屏情況下。讓因在該window之外,而發(fā)送到后面的window的觸摸屏能夠支持split touchpublic static final int FLAG_SPLIT_TOUCH = 0x00800000;//Flag:對該window進行硬件加速,該flag必須在Activity或Dialog的Content View之前進行設(shè)置public static final int FLAG_HARDWARE_ACCELERATED = 0x01000000;//Flag:讓window占滿整個手機屏幕。不留不論什么邊界public static final int FLAG_LAYOUT_IN_OVERSCAN = 0x02000000;//Flag:請求一個半透明的狀態(tài)欄背景以最小的系統(tǒng)提供保護public static final int FLAG_TRANSLUCENT_STATUS = 0x04000000;//Flag:請求一個半透明的導(dǎo)航欄背景以最小的系統(tǒng)提供保護public static final int FLAG_TRANSLUCENT_NAVIGATION = 0x08000000;//Flag:......public static final int FLAG_LOCAL_FOCUS_MODE = 0x10000000;public static final int FLAG_SLIPPERY = 0x20000000;public static final int FLAG_LAYOUT_ATTACHED_IN_DECOR = 0x40000000;public static final int FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS = 0x80000000;//行為選項標記public int flags;//PrivateFlags:......public static final int PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED = 0x00000001;public static final int PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED = 0x00000002;public static final int PRIVATE_FLAG_WANTS_OFFSET_NOTIFICATIONS = 0x00000004;public static final int PRIVATE_FLAG_SHOW_FOR_ALL_USERS = 0x00000010;public static final int PRIVATE_FLAG_NO_MOVE_ANIMATION = 0x00000040;public static final int PRIVATE_FLAG_COMPATIBLE_WINDOW = 0x00000080;public static final int PRIVATE_FLAG_SYSTEM_ERROR = 0x00000100;public static final int PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR = 0x00000200;public static final int PRIVATE_FLAG_KEYGUARD = 0x00000400;public static final int PRIVATE_FLAG_DISABLE_WALLPAPER_TOUCH_EVENTS = 0x00000800;//私有的行為選項標記public int privateFlags;public static final int NEEDS_MENU_UNSET = 0;public static final int NEEDS_MENU_SET_TRUE = 1;public static final int NEEDS_MENU_SET_FALSE = 2;public int needsMenuKey = NEEDS_MENU_UNSET;public static boolean mayUseInputMethod(int flags) {......}//SOFT_INPUT:用于描寫敘述軟鍵盤顯示規(guī)則的bite的maskpublic static final int SOFT_INPUT_MASK_STATE = 0x0f;//SOFT_INPUT:沒有軟鍵盤顯示的約定規(guī)則public static final int SOFT_INPUT_STATE_UNSPECIFIED = 0;//SOFT_INPUT:可見性狀態(tài)softInputMode,請不要改變軟輸入?yún)^(qū)域的狀態(tài)public static final int SOFT_INPUT_STATE_UNCHANGED = 1;//SOFT_INPUT:用戶導(dǎo)航(navigate)到你的窗體時隱藏軟鍵盤public static final int SOFT_INPUT_STATE_HIDDEN = 2;//SOFT_INPUT:總是隱藏軟鍵盤public static final int SOFT_INPUT_STATE_ALWAYS_HIDDEN = 3;//SOFT_INPUT:用戶導(dǎo)航(navigate)到你的窗體時顯示軟鍵盤public static final int SOFT_INPUT_STATE_VISIBLE = 4;//SOFT_INPUT:總是顯示軟鍵盤public static final int SOFT_INPUT_STATE_ALWAYS_VISIBLE = 5;//SOFT_INPUT:顯示軟鍵盤時用于表示window調(diào)整方式的bite的maskpublic static final int SOFT_INPUT_MASK_ADJUST = 0xf0;//SOFT_INPUT:不指定顯示軟件盤時,window的調(diào)整方式public static final int SOFT_INPUT_ADJUST_UNSPECIFIED = 0x00;//SOFT_INPUT:當(dāng)顯示軟鍵盤時,調(diào)整window內(nèi)的控件大小以便顯示軟鍵盤public static final int SOFT_INPUT_ADJUST_RESIZE = 0x10;//SOFT_INPUT:當(dāng)顯示軟鍵盤時,調(diào)整window的空白區(qū)域來顯示軟鍵盤,即使調(diào)整空白區(qū)域,軟鍵盤還是有可能遮擋一些有內(nèi)容區(qū)域。這時用戶就僅僅有退出軟鍵盤才干看到這些被遮擋區(qū)域并進行public static final int SOFT_INPUT_ADJUST_PAN = 0x20;//SOFT_INPUT:當(dāng)顯示軟鍵盤時,不調(diào)整window的布局public static final int SOFT_INPUT_ADJUST_NOTHING = 0x30;//SOFT_INPUT:用戶導(dǎo)航(navigate)到了你的windowpublic static final int SOFT_INPUT_IS_FORWARD_NAVIGATION = 0x100;//軟輸入法模式選項public int softInputMode;//窗體怎樣停靠public int gravity;//水平邊距,容器與widget之間的距離,占容器寬度的百分率public float horizontalMargin;//縱向邊距public float verticalMargin;//積極的insets畫圖表面和窗體之間的內(nèi)容public final Rect surfaceInsets = new Rect();//期望的位圖格式,默覺得不透明,參考android.graphics.PixelFormatpublic int format;//窗體所使用的動畫設(shè)置,它必須是一個系統(tǒng)資源而不是應(yīng)用程序資源,由于窗體管理器不能訪問應(yīng)用程序public int windowAnimations;//整個窗體的半透明值,1.0表示不透明,0.0表示全透明public float alpha = 1.0f;//當(dāng)FLAG_DIM_BEHIND設(shè)置后生效,該變量指示后面的窗體變暗的程度。1.0表示全然不透明,0.0表示沒有變暗public float dimAmount = 1.0f;public static final float BRIGHTNESS_OVERRIDE_NONE = -1.0f;public static final float BRIGHTNESS_OVERRIDE_OFF = 0.0f;public static final float BRIGHTNESS_OVERRIDE_FULL = 1.0f;public float screenBrightness = BRIGHTNESS_OVERRIDE_NONE;//用來覆蓋用戶設(shè)置的屏幕亮度,表示應(yīng)用用戶設(shè)置的屏幕亮度。從0到1調(diào)整亮度從暗到最亮發(fā)生變化public float buttonBrightness = BRIGHTNESS_OVERRIDE_NONE;public static final int ROTATION_ANIMATION_ROTATE = 0;public static final int ROTATION_ANIMATION_CROSSFADE = 1;public static final int ROTATION_ANIMATION_JUMPCUT = 2;//定義出入境動畫在這個窗體旋轉(zhuǎn)設(shè)備時使用public int rotationAnimation = ROTATION_ANIMATION_ROTATE;//窗體的標示符public IBinder token = null;//此窗體所在的包名public String packageName = null;//屏幕方向public int screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;//首選的刷新率的窗體public float preferredRefreshRate;//控制status bar是否顯示public int systemUiVisibility;//ui能見度所請求的視圖層次結(jié)構(gòu)public int subtreeSystemUiVisibility;//得到關(guān)于系統(tǒng)ui能見度變化的回調(diào)public boolean hasSystemUiListeners;public static final int INPUT_FEATURE_DISABLE_POINTER_GESTURES = 0x00000001;public static final int INPUT_FEATURE_NO_INPUT_CHANNEL = 0x00000002;public static final int INPUT_FEATURE_DISABLE_USER_ACTIVITY = 0x00000004;public int inputFeatures;public long userActivityTimeout = -1;......public final int copyFrom(LayoutParams o) {......}......public void scale(float scale) {......}......}

看見沒有。從上面類能夠看出,Android窗體類型主要分成了三大類:

  • 應(yīng)用程序窗體。

    一般應(yīng)用程序的窗體,比方我們應(yīng)用程序的Activity的窗體。

  • 子窗體。一般在Activity里面的窗體,比方對話框等。
  • 系統(tǒng)窗體。系統(tǒng)的窗體,比方輸入法,Toast,墻紙等。

  • 同一時候還能夠看見,WindowManager.LayoutParams里面窗體的type類型值定義是一個遞增保留的連續(xù)增大數(shù)值,從凝視能夠看出來事實上就是窗體的Z-ORDER序列(值越大顯示的位置越在上面,你須要將屏幕想成三維坐標模式)。創(chuàng)建不同類型的窗體須要設(shè)置不同的type值,譬如上面拓展Activity窗體載入時分析的makeVisible方法中的Window默認屬性的type=TYPE_APPLICATION。

    既然說這個類非常重要。那總得感性的體驗一下重要性吧,所以我們先來看幾個實例。

    2-4 通過上面WindowManager.LayoutParams分析引出的應(yīng)用層開發(fā)經(jīng)常使用經(jīng)典實例

    有了上面分析相信你一定覺得WindowManager.LayoutParams還是蠻熟悉的,不信我們來看下。

    Part1:開發(fā)APP時設(shè)置Activity全屏常亮的一種辦法(設(shè)置Activity也就是Activity的Window):

    public class MainActivity extends ActionBarActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//設(shè)置Activity的Window為全屏。當(dāng)然也能夠在xml中設(shè)置Window window = getWindow();WindowManager.LayoutParams windowAttributes = window.getAttributes();windowAttributes.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN | windowAttributes.flags;window.setAttributes(windowAttributes);//設(shè)置Activity的Window為保持屏幕亮window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);setContentView(R.layout.activity_main);} }

    這是運行結(jié)果:

    Part2:App開發(fā)中彈出軟鍵盤時以下的輸入框被軟件盤擋住問題的解決的方法:

    在Activity中的onCreate中setContentView之前寫例如以下代碼:

    //你也能夠在xml文件里設(shè)置。一樣的效果 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE|WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

    Part3:創(chuàng)建懸浮窗體(仿IPhone的小圓點或者魅族的小白點或者360手機衛(wèi)士的小浮標)。退出當(dāng)前Activity依然可見的一種實現(xiàn)方法:

    省略了Activity的start與stop Service的按鈕代碼,直接給出了核心代碼例如以下:

    /*** Author : yanbo* Time : 14:47* Description : 手機屏幕懸浮窗,仿IPhone小圓點* (未全然實現(xiàn)。僅僅提供思路,如需請自行實現(xiàn))* Notice : <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />*/ public class WindowService extends Service {private WindowManager mWindowManager;private ImageView mImageView;@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();//創(chuàng)建懸浮窗createFloatWindow();}private void createFloatWindow() {//這里的參數(shù)設(shè)置上面剛剛講過。不再說明WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();mWindowManager = (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);//設(shè)置window的typelayoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;//設(shè)置效果為背景透明layoutParams.format = PixelFormat.RGBA_8888;//設(shè)置浮動窗體不可聚焦layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;layoutParams.gravity = Gravity.BOTTOM | Gravity.RIGHT;layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;layoutParams.x = -50;layoutParams.y = -50;mImageView = new ImageView(this);mImageView.setImageResource(android.R.drawable.ic_menu_add);//加入到WindowmWindowManager.addView(mImageView, layoutParams);//設(shè)置監(jiān)聽mImageView.setOnTouchListener(touchListener);}@Overridepublic void onDestroy() {super.onDestroy();if (mImageView != null) {//講WindowManager時說過。add,remove成對出現(xiàn),所以須要removemWindowManager.removeView(mImageView);}}private View.OnTouchListener touchListener = new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {//模擬觸摸觸發(fā)的事件Intent intent = new Intent(Intent.ACTION_VIEW);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);return false;}}; }

    例如以下是運行過程模擬,特別留意屏幕右下角的變化:

    怎么樣,通過最后這個樣例你是不是就能體會到WindowManager.LayoutParams的Z-ORDER序列類型,值越大顯示的位置越在上面。

    2-5 總結(jié)Activity的窗體加入機制

    有了上面這么多分析和前幾篇的分析,我們對Activity的窗體載入再次深入分析總結(jié)例如以下:

    能夠看見Context的WindowManager對每一個APP來說是一個全局單例的。而Activity的WindowManager是每一個Activity都會新創(chuàng)建一個的(事實上你從上面分析的兩個實例化WindowManagerImpl的構(gòu)造函數(shù)參數(shù)傳遞就能夠看出來,Activity中Window的WindowManager成員在構(gòu)造實例化時傳入給WindowManagerImpl中mParentWindow成員的是當(dāng)前Window對象。而ContextImpl的static塊中單例實例化WindowManagerImpl時傳入給WindowManagerImpl中mParentWindow成員的是null值)。所以上面模擬蘋果浮動小圖標使用了Application的WindowManager而不是Activity的,原因就在于這里;使用Activity的WindowManager時當(dāng)Activity結(jié)束時WindowManager就無效了。所以使用Activity的getSysytemService(WINDOW_SERVICE)獲取的是Local的WindowManager。同一時候能夠看出來Activity中的WindowManager.LayoutParams的type為TYPE_APPLICATION。

    好了。上面也說了不少了,有了上面這些知識點以后我們就來開始分析Android應(yīng)用Activity、Dialog、PopWindow窗體顯示機制。

    【工匠若水 http://blog.csdn.net/yanbober 轉(zhuǎn)載煩請注明出處,尊重勞動成果】

    3 Android應(yīng)用Dialog窗體加入顯示機制源代碼

    3-1 Dialog窗體源代碼分析

    寫過APP都知道,Dialog是一系列XXXDialog的基類,我們能夠new隨意Dialog或者通過Activity提供的onCreateDialog(……)、onPrepareDialog(……)和showDialog(……)等方法來管理我們的Dialog,可是究事實上質(zhì)都是來源于Dialog基類,所以我們對于各種XXXDialog來說僅僅用分析Dialog的窗體載入就能夠了。

    例如以下從Dialog的構(gòu)造函數(shù)開始分析:

    public class Dialog implements DialogInterface, Window.Callback,KeyEvent.Callback, OnCreateContextMenuListener, Window.OnWindowDismissedCallback {......public Dialog(Context context) {this(context, 0, true);}//構(gòu)造函數(shù)終于都調(diào)運了這個默認的構(gòu)造函數(shù)Dialog(Context context, int theme, boolean createContextThemeWrapper) {//默認構(gòu)造函數(shù)的createContextThemeWrapper為trueif (createContextThemeWrapper) {//默認構(gòu)造函數(shù)的theme為0if (theme == 0) {TypedValue outValue = new TypedValue();context.getTheme().resolveAttribute(com.android.internal.R.attr.dialogTheme,outValue, true);theme = outValue.resourceId;}mContext = new ContextThemeWrapper(context, theme);} else {mContext = context;}//mContext已經(jīng)從外部傳入的context對象獲得值(通常是個Activity)。!。非常重要。先記住!!。//獲取WindowManager對象mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);//為Dialog創(chuàng)建新的WindowWindow w = PolicyManager.makeNewWindow(mContext);mWindow = w;//Dialog能夠接受到按鍵事件的原因w.setCallback(this);w.setOnWindowDismissedCallback(this);//關(guān)聯(lián)WindowManager與新Window。特別注意第二個參數(shù)token為null。也就是說Dialog沒有自己的token//一個Window屬于Dialog的話。那么該Window的mAppToken對象是nullw.setWindowManager(mWindowManager, null, null);w.setGravity(Gravity.CENTER);mListenersHandler = new ListenersHandler(this);}...... }

    能夠看到。Dialog構(gòu)造函數(shù)首先把外部傳入的參數(shù)context對象賦值給了當(dāng)前類的成員(我們的Dialog一般都是在Activity中啟動的。所以這個context通常是個Activity),然后調(diào)用context.getSystemService(Context.WINDOW_SERVICE)獲取WindowManager。這個WindowManager是哪來的呢?先依照上面說的context通常是個Activity來看待,能夠發(fā)現(xiàn)這句實質(zhì)就是Activity的getSystemService方法,我們看下源代碼,例如以下:

    @Overridepublic Object getSystemService(@ServiceName @NonNull String name) {if (getBaseContext() == null) {throw new IllegalStateException("System services not available to Activities before onCreate()");}//我們Dialog中獲得的WindowManager對象就是這個分支if (WINDOW_SERVICE.equals(name)) {//Activity的WindowManagerreturn mWindowManager;} else if (SEARCH_SERVICE.equals(name)) {ensureSearchManager();return mSearchManager;}return super.getSystemService(name);}

    看見沒有。Dialog中的WindowManager成員實質(zhì)和Activity里面是一樣的,也就是共用了一個WindowManager。

    回到Dialog的構(gòu)造函數(shù)繼續(xù)分析,在得到了WindowManager之后,程序又新建了一個Window對象(類型是PhoneWindow類型,和Activity的Window新建過程相似)。接著通過w.setCallback(this)設(shè)置Dialog為當(dāng)前window的回調(diào)接口。這樣Dialog就能夠接收事件處理了;接著把從Activity拿到的WindowManager對象關(guān)聯(lián)到新創(chuàng)建的Window中。

    至此Dialog的創(chuàng)建過程Window處理已經(jīng)完成,非常easy。所以接下來我們繼續(xù)看看Dialog的show與cancel方法。例如以下:

    public void show() {......if (!mCreated) {//回調(diào)Dialog的onCreate方法dispatchOnCreate(null);}//回調(diào)Dialog的onStart方法onStart();//相似于Activity,獲取當(dāng)前新Window的DecorView對象,所以有一種自己定義Dialog布局的方式就是重寫Dialog的onCreate方法,使用setContentView傳入布局。就像前面文章分析Activity相似mDecor = mWindow.getDecorView();......//獲取新Window的WindowManager.LayoutParams參數(shù)。和上面分析的Activity一樣type為TYPE_APPLICATIONWindowManager.LayoutParams l = mWindow.getAttributes();......try {//把一個View加入到Activity共用的windowManager里面去mWindowManager.addView(mDecor, l);......} finally {}}

    能夠看見Dialog的新Window與Activity的Window的type相同都為TYPE_APPLICATION,上面介紹WindowManager.LayoutParams時TYPE_APPLICATION的凝視明白說過,普通應(yīng)用程序窗體TYPE_APPLICATION的token必須設(shè)置為Activity的token來指定窗體屬于誰。所以能夠看見,既然Dialog和Activity共享同一個WindowManager(也就是上面分析的WindowManagerImpl),而WindowManagerImpl里面有個Window類型的mParentWindow變量。這個變量在Activity的attach中創(chuàng)建WindowManagerImpl時傳入的為當(dāng)前Activity的Window,而當(dāng)前Activity的Window里面的mAppToken值又為當(dāng)前Activity的token。所以Activity與Dialog共享了同一個mAppToken值,僅僅是Dialog和Activity的Window對象不同。

    3-2 Dialog窗體載入總結(jié)

    通過上面分析Dialog的窗體載入原理,我們總結(jié)例如以下圖:

    從圖中能夠看出。Activity和Dialog共用了一個Token對象,Dialog必須依賴于Activity而顯示(通過別的context搞完之后token都為null,終于會在ViewRootImpl的setView方法中載入時由于token為null拋出異常)。所以Dialog的Context傳入?yún)?shù)通常是一個存在的Activity,假設(shè)Dialog彈出來之前Activity已經(jīng)被銷毀了,則這個Dialog在彈出的時候就會拋出異常。由于token不可用了。在Dialog的構(gòu)造函數(shù)中我們關(guān)聯(lián)了新Window的callback事件監(jiān)聽處理,所以當(dāng)Dialog顯示時Activity無法消費當(dāng)前的事件。

    到此Dialog的窗體載入機制就分析完成了,接下來我們說說應(yīng)用開發(fā)中常見的一個詭異問題。

    3-3 從Dialog窗體載入分析引出的應(yīng)用開發(fā)問題

    有了上面的分析我們接下來看下平時開發(fā)App剛開始學(xué)習(xí)的人easy犯的幾個錯誤。

    實如今一個Activity中顯示一個Dialog,例如以下代碼:

    public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {setContentView(R.layout.activity_main);//重點關(guān)注構(gòu)造函數(shù)的參數(shù),創(chuàng)建一個Dialog然后顯示出來Dialog dialog = new ProgressDialog(this);dialog.setTitle("TestDialogContext");dialog.show();} }

    分析:使用了Activity為context,也即和Activity共用token,符合上面的分析。所以不會報錯,正常運行。

    實如今一個Activity中顯示一個Dialog,例如以下代碼:

    public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {setContentView(R.layout.activity_main);//重點關(guān)注構(gòu)造函數(shù)的參數(shù),創(chuàng)建一個Dialog然后顯示出來Dialog dialog = new ProgressDialog(getApplicationContext());dialog.setTitle("TestDialogContext");dialog.show();} }

    分析:傳入的是Application的Context,導(dǎo)致TYPE_APPLICATION類型Dialog的token為null。所以拋出例如以下異常,無法顯示對話框。

    Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an applicationat android.view.ViewRootImpl.setView(ViewRootImpl.java:566)at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:272)at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)at android.app.Dialog.show(Dialog.java:298)

    實如今一個Service中顯示一個Dialog。例如以下代碼:

    public class WindowService extends Service {@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();//重點關(guān)注構(gòu)造函數(shù)的參數(shù)Dialog dialog = new ProgressDialog(this);dialog.setTitle("TestDialogContext");dialog.show();} }

    分析:傳入的Context是一個Service,相似上面?zhèn)魅階pplicationContext一樣的后果,一樣的原因。拋出例如以下異常:

    Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an applicationat android.view.ViewRootImpl.setView(ViewRootImpl.java:566)at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:272)at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)at android.app.Dialog.show(Dialog.java:298)

    至此通過我們平時使用最多的Dialog也驗證了Dialog成功顯示的必要條件,同一時候也讓大家避免了再次使用Dialog不當(dāng)出現(xiàn)異常的情況,或者出現(xiàn)相似異常后知道真實的背后原因是什么的問題。

    能夠看見。Dialog的實質(zhì)無非也是使用WindowManager的addView、updateViewLayout、removeView進行一些操作展示。

    【工匠若水 http://blog.csdn.net/yanbober 轉(zhuǎn)載煩請注明出處,尊重勞動成果】

    4 Android應(yīng)用PopWindow窗體加入顯示機制源代碼

    PopWindow實質(zhì)就是彈出式菜單。它與Dialag不同的地方是不會使依賴的Activity組件失去焦點(PopupWindow彈出后能夠繼續(xù)與依賴的Activity進行交互)。Dialog卻不能這樣。同一時候PopupWindow與Dialog還有一個不同點是PopupWindow是一個堵塞的對話框。假設(shè)你直接在Activity的onCreate等方法中顯示它則會報錯,所以PopupWindow必須在某個事件中顯示地或者是開啟一個新線程去調(diào)用。

    說這么多還是直接看代碼吧。

    4-1 PopWindow窗體源代碼分析

    根據(jù)PopWindow的使用,我們選擇最經(jīng)常使用的方式來分析。例如以下先看當(dāng)中經(jīng)常使用的一種構(gòu)造函數(shù):

    public class PopupWindow {......//我們僅僅分析最經(jīng)常使用的一種構(gòu)造函數(shù)public PopupWindow(View contentView, int width, int height, boolean focusable) {if (contentView != null) {//獲取mContext。contentView實質(zhì)是View,View的mContext都是構(gòu)造函數(shù)傳入的,View又層級傳遞,所以終于這個mContext實質(zhì)是Activity。!!

    非常重要

    mContext = contentView.getContext(); //獲取Activity的getSystemService的WindowManager mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); } //進行一些Window類的成員變量初始化賦值操作 setContentView(contentView); setWidth(width); setHeight(height); setFocusable(focusable); } ...... }

    能夠看見,構(gòu)造函數(shù)僅僅是初始化了一些變量,看完構(gòu)造函數(shù)繼續(xù)看下PopWindow的展示函數(shù)。例如以下:

    public void showAsDropDown(View anchor, int xoff, int yoff, int gravity) {......//anchor是Activity中PopWindow準備依附的View,這個View的token實質(zhì)也是Activity的Window中的token,也即Activity的token//第一步 初始化WindowManager.LayoutParamsWindowManager.LayoutParams p = createPopupLayout(anchor.getWindowToken());//第二步preparePopup(p);......//第三步invokePopup(p);}

    能夠看見,當(dāng)我們想將PopWindow展示在anchor的下方向(Z軸是在anchor的上面)旁邊時經(jīng)理了上面三步。我們一步一步來分析。先看第一步。源代碼例如以下:

    private WindowManager.LayoutParams createPopupLayout(IBinder token) {//實例化一個默認的WindowManager.LayoutParams。當(dāng)中type=TYPE_APPLICATIONWindowManager.LayoutParams p = new WindowManager.LayoutParams();//設(shè)置Gravityp.gravity = Gravity.START | Gravity.TOP;//設(shè)置寬高p.width = mLastWidth = mWidth;p.height = mLastHeight = mHeight;//根據(jù)背景設(shè)置formatif (mBackground != null) {p.format = mBackground.getOpacity();} else {p.format = PixelFormat.TRANSLUCENT;}//設(shè)置flagsp.flags = computeFlags(p.flags);//改動type=WindowManager.LayoutParams.TYPE_APPLICATION_PANEL,mWindowLayoutType有初始值,type類型為子窗體p.type = mWindowLayoutType;//設(shè)置token為Activity的tokenp.token = token;......return p;}

    接著回到showAsDropDown方法看看第二步,例如以下源代碼:

    private void preparePopup(WindowManager.LayoutParams p) {......//有無設(shè)置PopWindow的background差別if (mBackground != null) {......//假設(shè)有背景則創(chuàng)建一個PopupViewContainer對象的ViewGroupPopupViewContainer popupViewContainer = new PopupViewContainer(mContext);PopupViewContainer.LayoutParams listParams = new PopupViewContainer.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height);//把背景設(shè)置給PopupViewContainer的ViewGrouppopupViewContainer.setBackground(mBackground);//把我們構(gòu)造函數(shù)傳入的View加入到這個ViewGrouppopupViewContainer.addView(mContentView, listParams);//返回這個ViewGroupmPopupView = popupViewContainer;} else {//假設(shè)沒有通過PopWindow的setBackgroundDrawable設(shè)置背景則直接賦值當(dāng)前傳入的View為PopWindow的ViewmPopupView = mContentView;}......}

    能夠看見preparePopup方法的作用就是推斷設(shè)置View。假設(shè)有背景則會在傳入的contentView外面包一層PopupViewContainer(實質(zhì)是一個重寫了事件處理的FrameLayout)之后作為mPopupView。假設(shè)沒有背景則直接用contentView作為mPopupView。

    我們再來看下這里的PopupViewContainer類。例如以下源代碼:

    private class PopupViewContainer extends FrameLayout {......@Overrideprotected int[] onCreateDrawableState(int extraSpace) {......}@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {......}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {if (mTouchInterceptor != null && mTouchInterceptor.onTouch(this, ev)) {return true;}return super.dispatchTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent event) {......if(xxx) {dismiss();}......}@Overridepublic void sendAccessibilityEvent(int eventType) {......}}

    能夠看見,這個PopupViewContainer是一個PopWindow的內(nèi)部私有類,它繼承了FrameLayout。在當(dāng)中重寫了Key和Touch事件的分發(fā)處理邏輯。同一時候查閱PopupView能夠發(fā)現(xiàn),PopupView類自身沒有重寫Key和Touch事件的處理,所以假設(shè)沒有將傳入的View對象放入封裝的ViewGroup中。則點擊Back鍵或者PopWindow以外的區(qū)域PopWindow是不會消失的(事實上PopWindow中沒有向Activity及Dialog一樣new新的Window,所以不會有新的callback設(shè)置。也就沒法處理事件消費了)。

    接著繼續(xù)回到showAsDropDown方法看看第三步。例如以下源代碼:

    private void invokePopup(WindowManager.LayoutParams p) {if (mContext != null) {p.packageName = mContext.getPackageName();}mPopupView.setFitsSystemWindows(mLayoutInsetDecor);setLayoutDirectionFromAnchor();mWindowManager.addView(mPopupView, p);}

    能夠看見。這里使用了Activity的WindowManager將我們的PopWindow進行了顯示。

    到此能夠發(fā)現(xiàn)。PopWindow的實質(zhì)無非也是使用WindowManager的addView、updateViewLayout、removeView進行一些操作展示。與Dialog不同的地方是沒有新new Window而已(也就沒法設(shè)置callback。無法消費事件,也就是前面說的PopupWindow彈出后能夠繼續(xù)與依賴的Activity進行交互的原因)。

    到此PopWindw的窗體載入顯示機制就分析完成了,接下來進行總結(jié)與應(yīng)用開發(fā)技巧提示。

    4-2 PopWindow窗體源代碼分析總結(jié)及應(yīng)用開發(fā)技巧提示

    通過上面分析能夠發(fā)現(xiàn)總結(jié)例如以下圖:

    能夠看見,PopWindow全然使用了Activity的Window與WindowManager,相對來說比較簡單easy記理解。

    再來看一個開發(fā)技巧:

    假設(shè)設(shè)置了PopupWindow的background。則點擊Back鍵或者點擊PopupWindow以外的區(qū)域時PopupWindow就會dismiss;假設(shè)不設(shè)置PopupWindow的background。則點擊Back鍵或者點擊PopupWindow以外的區(qū)域PopupWindow不會消失。

    【工匠若水 http://blog.csdn.net/yanbober 轉(zhuǎn)載煩請注明出處,尊重勞動成果】

    5 Android應(yīng)用Toast窗體加入顯示機制源代碼

    5-1 基礎(chǔ)知識準備

    在開始分析這幾個窗體之前須要腦補一點東東,我們從應(yīng)用層開發(fā)來直觀腦補,這樣以下分析源代碼時就不蛋疼了。

    例如以下是一個我們寫的兩個應(yīng)用實現(xiàn)Service跨進程調(diào)用服務(wù)ADIL的樣例,client調(diào)運遠程Service的start與stop方法控制遠程Service的操作。

    Android系統(tǒng)中的應(yīng)用程序都運行在各自的進程中,進程之間是無法直接交換數(shù)據(jù)的。可是Android為開發(fā)人員提供了AIDL跨進程調(diào)用Service的功能。事實上AIDL就相當(dāng)于兩方約定的一個規(guī)則而已。

    先看下在Android Studio中AIDL開發(fā)的project文件夾結(jié)構(gòu),例如以下:

    由于AIDL文件里不能出現(xiàn)訪問修飾符(如public),同一時候AIDL文件在兩個項目中要全然一致并且僅僅支持基本類型。所以我們定義的AIDL文件例如以下:

    ITestService.aidl

    package io.github.yanbober.myapplication;interface ITestService {void start(int id);void stop(int id); }

    再來看下根據(jù)aidl文件自己主動生成的ITestService.java文件吧。例如以下:

    /** This file is auto-generated. DO NOT MODIFY.*/ package io.github.yanbober.myapplication; public interface ITestService extends android.os.IInterface {//Stub類是ITestService接口的內(nèi)部靜態(tài)抽象類,該類繼承了Binder類public static abstract class Stub extends android.os.Binder implements io.github.yanbober.myapplication.ITestService{......//這是抽象靜態(tài)Stub類中的asInterface方法,該方法負責(zé)將service返回至client的對象轉(zhuǎn)換為ITestService.Stub//把遠程Service的Binder對象傳遞進去,得到的是遠程服務(wù)的本地代理public static io.github.yanbober.myapplication.ITestService asInterface(android.os.IBinder obj){......}......//遠程服務(wù)的本地代理,也會繼承自ITestServiceprivate static class Proxy implements io.github.yanbober.myapplication.ITestService{......@Overridepublic void start(int id) throws android.os.RemoteException{......}@Overridepublic void stop(int id) throws android.os.RemoteException{......}}......}//兩個方法是aidl文件里定義的方法public void start(int id) throws android.os.RemoteException;public void stop(int id) throws android.os.RemoteException; }

    這就是自己主動生成的java文件,接下來我們看看服務(wù)端的Service源代碼,例如以下:

    //記得在AndroidManifet.xml中注冊Service的<action android:name="io.github.yanbober.myapplication.aidl" />public class TestService extends Service {private TestBinder mTestBinder;//該類繼承ITestService.Stub類而不是Binder類,由于ITestService.Stub是Binder的子類//進程內(nèi)的Service定義TestBinder內(nèi)部類是繼承Binder類public class TestBinder extends ITestService.Stub {@Overridepublic void start(int id) throws RemoteException {Log.i(null, "Server Service is start!");}@Overridepublic void stop(int id) throws RemoteException {Log.i(null, "Server Service is stop!");}}@Overridepublic IBinder onBind(Intent intent) {//返回Binderreturn mTestBinder;}@Overridepublic void onCreate() {super.onCreate();//實例化BindermTestBinder = new TestBinder();} }

    如今服務(wù)端App的代碼已經(jīng)OK,我們來看下client的代碼。client首先也要像上面的project結(jié)構(gòu)一樣,把AIDL文件放好。接著在client使用遠程服務(wù)端的Service代碼例如以下:

    public class MainActivity extends Activity {private static final String REMOT_SERVICE_ACTION = "io.github.yanbober.myapplication.aidl";private Button mStart, mStop;private ITestService mBinder;private ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {//獲得還有一個進程中的Service傳遞過來的IBinder對象//用IMyService.Stub.asInterface方法轉(zhuǎn)換該對象mBinder = ITestService.Stub.asInterface(service);}@Overridepublic void onServiceDisconnected(ComponentName name) {}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mStart = (Button) this.findViewById(R.id.start);mStop = (Button) this.findViewById(R.id.stop);mStart.setOnClickListener(clickListener);mStop.setOnClickListener(clickListener);//綁定遠程跨進程ServicebindService(new Intent(REMOT_SERVICE_ACTION), connection, BIND_AUTO_CREATE);}@Overrideprotected void onDestroy() {super.onDestroy();//取消綁定遠程跨進程ServiceunbindService(connection);}private View.OnClickListener clickListener = new View.OnClickListener() {@Overridepublic void onClick(View v) {調(diào)用遠程Service中的start與stop方法switch (v.getId()) {case R.id.start:try {mBinder.start(0x110);} catch (RemoteException e) {e.printStackTrace();}break;case R.id.stop:try {mBinder.stop(0x120);} catch (RemoteException e) {e.printStackTrace();}break;}}}; }

    到此你相應(yīng)用層通過AIDL使用遠程Service的形式已經(jīng)非常熟悉了,至于實質(zhì)的通信使用Binder的機制我們后面會寫文章一步一步往下分析。到此的準備知識已經(jīng)足夠用來理解以下我們的源代碼分析了。

    5-2 Toast窗體源代碼分析

    我們經(jīng)常使用的Toast窗體事實上和前面分析的Activity、Dialog、PopWindow都是不同的。由于它和輸入法、墻紙相似。都是系統(tǒng)窗體。

    我們還是依照最經(jīng)常使用的方式來分析源代碼吧。

    我們先看下Toast的靜態(tài)makeText方法吧,例如以下:

    public static Toast makeText(Context context, CharSequence text, @Duration int duration) {//new一個Toast對象Toast result = new Toast(context);//獲取前面有篇文章分析的LayoutInflaterLayoutInflater inflate = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//載入解析Toast的布局。實質(zhì)transient_notification.xml是一個LinearLayout中套了一個@android:id/message的TextView而已View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);//取出布局中的TextViewTextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);//把我們的文字設(shè)置到TextView上tv.setText(text);//設(shè)置一些屬性result.mNextView = v;result.mDuration = duration;//返回新建的Toastreturn result;}

    能夠看見。這種方法構(gòu)造了一個Toast,然后把要顯示的文本放到這個View的TextView中,然后初始化相關(guān)屬性后返回這個新的Toast對象。

    當(dāng)我們有了這個Toast對象之后。能夠通過show方法來顯示出來。例如以下看下show方法源代碼:

    public void show() {......//通過AIDL(Binder)通信拿到NotificationManagerService的服務(wù)訪問接口。當(dāng)前Toast類相當(dāng)于上面樣例的client!

    !。相當(dāng)重要!!!

    INotificationManager service = getService(); String pkg = mContext.getOpPackageName(); TN tn = mTN; tn.mNextView = mNextView; try { //把TN對象和一些參數(shù)傳遞到遠程NotificationManagerService中去 service.enqueueToast(pkg, tn, mDuration); } catch (RemoteException e) { // Empty } }

    我們看看show方法中調(diào)運的getService方法,例如以下:

    //遠程NotificationManagerService的服務(wù)訪問接口private static INotificationManager sService;static private INotificationManager getService() {//單例模式if (sService != null) {return sService;}//通過AIDL(Binder)通信拿到NotificationManagerService的服務(wù)訪問接口sService = INotificationManager.Stub.asInterface(ServiceManager.getService("notification"));return sService;}

    通過上面我們的基礎(chǔ)腦補實例你也能看懂這個getService方法了吧。那接著我們來看mTN吧,好像mTN在Toast的構(gòu)造函數(shù)里見過一眼,我們來看看。例如以下:

    public Toast(Context context) {mContext = context;mTN = new TN();mTN.mY = context.getResources().getDimensionPixelSize(com.android.internal.R.dimen.toast_y_offset);mTN.mGravity = context.getResources().getInteger(com.android.internal.R.integer.config_toastDefaultGravity);}

    能夠看見mTN確實是在構(gòu)造函數(shù)中實例化的,那我們就來看看這個TN類,例如以下:

    //相似于上面樣例的服務(wù)端實例化的Service內(nèi)部類Binderprivate static class TN extends ITransientNotification.Stub {......//實現(xiàn)了AIDL的show與hide方法@Overridepublic void show() {if (localLOGV) Log.v(TAG, "SHOW: " + this);mHandler.post(mShow);}@Overridepublic void hide() {if (localLOGV) Log.v(TAG, "HIDE: " + this);mHandler.post(mHide);}......}

    看見沒有,TN是Toast內(nèi)部的一個私有靜態(tài)類,繼承自ITransientNotification.Stub。你這時指定好奇ITransientNotification.Stub是個啥玩意,對吧?事實上你在上面的腦補實例中見過它的,他出如今服務(wù)端實現(xiàn)的Service中,就是一個Binder對象。也就是對一個aidl文件的實現(xiàn)而已,我們看下這個ITransientNotification.aidl文件。例如以下:

    package android.app;/** @hide */ oneway interface ITransientNotification {void show();void hide(); }

    看見沒有,和我們上面的樣例非常相似吧。

    再回到上面分析的show()方法中能夠看到。我們的Toast是傳給遠程的NotificationManagerService管理的,為了NotificationManagerService回到我們的應(yīng)用程序(回調(diào))。我們須要告訴NotificationManagerService我們當(dāng)前程序的Binder引用是什么(也就是TN)。是不是覺得和上面樣例有些不同,這里感覺Toast又充當(dāng)client。又充當(dāng)服務(wù)端的樣子,實質(zhì)就是一個回調(diào)過程而已。

    繼續(xù)來看Toast中的show方法的service.enqueueToast(pkg, tn, mDuration);語句。service實質(zhì)是遠程的NotificationManagerService。所以enqueueToast方法就是NotificationManagerService類的。例如以下:

    private final IBinder mService = new INotificationManager.Stub() {// Toasts// ============================================================================@Overridepublic void enqueueToast(String pkg, ITransientNotification callback, int duration){......synchronized (mToastQueue) {int callingPid = Binder.getCallingPid();long callingId = Binder.clearCallingIdentity();try {ToastRecord record;//查看該Toast是否已經(jīng)在隊列當(dāng)中int index = indexOfToastLocked(pkg, callback);// If it's already in the queue, we update it in place, we don't// move it to the end of the queue.//凝視說了,已經(jīng)存在則直接取出updateif (index >= 0) {record = mToastQueue.get(index);record.update(duration);} else {// Limit the number of toasts that any given package except the android// package can enqueue. Prevents DOS attacks and deals with leaks.......//將Toast封裝成ToastRecord對象,放入mToastQueue中record = new ToastRecord(callingPid, pkg, callback, duration);//把他加入到ToastQueue隊列中mToastQueue.add(record);index = mToastQueue.size() - 1;//將當(dāng)前Toast所在的進程設(shè)置為前臺進程keepProcessAliveLocked(callingPid);}//假設(shè)index為0,說明當(dāng)前入隊的Toast在隊頭,須要調(diào)用showNextToastLocked方法直接顯示if (index == 0) {showNextToastLocked();}} finally {Binder.restoreCallingIdentity(callingId);}}}}

    繼續(xù)看下該方法中調(diào)運的showNextToastLocked方法,例如以下:

    void showNextToastLocked() {//取出ToastQueue中隊列最前面的ToastRecordToastRecord record = mToastQueue.get(0);while (record != null) {try {//Toast類中實現(xiàn)的ITransientNotification.Stub的Binder接口TN,調(diào)運了那個類的show方法record.callback.show();scheduleTimeoutLocked(record);return;} catch (RemoteException e) {......}}}

    繼續(xù)先看下該方法中調(diào)運的scheduleTimeoutLocked方法。例如以下:

    private void scheduleTimeoutLocked(ToastRecord r){//移除上一條消息mHandler.removeCallbacksAndMessages(r);//根據(jù)Toast傳入的duration參數(shù)LENGTH_LONG=1來推斷決定多久發(fā)送消息Message m = Message.obtain(mHandler, MESSAGE_TIMEOUT, r);long delay = r.duration == Toast.LENGTH_LONG ?

    LONG_DELAY : SHORT_DELAY; //根據(jù)設(shè)置的MESSAGE_TIMEOUT后發(fā)送消息 mHandler.sendMessageDelayed(m, delay); }

    能夠看見這里先回調(diào)了Toast的TN的show,以下timeout可能就是hide了。接著還在該類的mHandler處理了這條消息。然后調(diào)運了例如以下處理方法:

    private void handleTimeout(ToastRecord record){......synchronized (mToastQueue) {int index = indexOfToastLocked(record.pkg, record.callback);if (index >= 0) {cancelToastLocked(index);}}}

    我們繼續(xù)看cancelToastLocked方法,例如以下:

    void cancelToastLocked(int index) {ToastRecord record = mToastQueue.get(index);try {//回調(diào)Toast的TN中實現(xiàn)的hide方法record.callback.hide();} catch (RemoteException e) {......}//從隊列移除當(dāng)前顯示的ToastmToastQueue.remove(index);keepProcessAliveLocked(record.pid);if (mToastQueue.size() > 0) {//假設(shè)當(dāng)前的Toast顯示完成隊列里還有其它的Toast則顯示其它的ToastshowNextToastLocked();}}

    到此能夠發(fā)現(xiàn),Toast的遠程管理NotificationManagerService類的處理實質(zhì)是通過Handler發(fā)送延時消息顯示取消Toast的,并且在遠程NotificationManagerService類中又遠程回調(diào)了Toast的TN類實現(xiàn)的show與hide方法。

    如今我們就回到Toast的TN類再看看這個show與hide方法,例如以下:

    ```javaprivate static class TN extends ITransientNotification.Stub {......//僅僅是實例化了一個Handler。非常重要!!!

    !。!

    !!

    final Handler mHandler = new Handler(); ...... final Runnable mShow = new Runnable() { @Override public void run() { handleShow(); } }; final Runnable mHide = new Runnable() { @Override public void run() { handleHide(); // Don't do this in handleHide() because it is also invoked by handleShow() mNextView = null; } }; ...... //實現(xiàn)了AIDL的show與hide方法 @Override public void show() { if (localLOGV) Log.v(TAG, "SHOW: " + this); mHandler.post(mShow); } @Override public void hide() { if (localLOGV) Log.v(TAG, "HIDE: " + this); mHandler.post(mHide); } ...... }

    能夠看見。這里實現(xiàn)aidl接口的方法實質(zhì)是通過handler的post來運行的一個方法,而這個Handler僅僅僅僅是new了一下。也就是說。假設(shè)我們寫APP時使用Toast在子線程中則須要自行準備Looper對象。僅僅有主線程Activity創(chuàng)建時幫忙準備了Looper(關(guān)于Handler與Looper假設(shè)整不明白請閱讀《Android異步消息處理機制具體解釋及源代碼分析》)。

    那我們重點關(guān)注一下handleShow與handleHide方法。例如以下:

    public void handleShow() {if (localLOGV) Log.v(TAG, "HANDLE SHOW: " + this + " mView=" + mView+ " mNextView=" + mNextView);if (mView != mNextView) {// remove the old view if necessary//假設(shè)有必要就通過WindowManager的remove刪掉舊的handleHide();mView = mNextView;Context context = mView.getContext().getApplicationContext();String packageName = mView.getContext().getOpPackageName();if (context == null) {context = mView.getContext();}//通過得到的context(通常是ContextImpl的context)獲取WindowManager對象(上一篇文章分析的單例的WindowManager)mWM = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);......//在把Toast的View加入之前發(fā)現(xiàn)Toast的View已經(jīng)被加入過(有partent)則刪掉if (mView.getParent() != null) {......mWM.removeView(mView);}......//把Toast的View加入到窗體,當(dāng)中mParams.type在構(gòu)造函數(shù)中賦值為TYPE_TOAST!!!。!

    特別重要

    mWM.addView(mView, mParams); ...... } } public void handleHide() {if (mView != null) {// note: checking parent() just to make sure the view has// been added... i have seen cases where we get here when// the view isn't yet added, so let's try not to crash.//凝視說得非常清楚了,不解釋,就是removeif (mView.getParent() != null) {mWM.removeView(mView);}mView = null;}}

    到此Toast的窗體加入原理就分析完成了,接下來我們進行總結(jié)。

    5-3 Toast窗體源代碼分析總結(jié)及應(yīng)用開發(fā)技巧

    經(jīng)過上面的分析我們總結(jié)例如以下:

    通過上面分析及上圖直觀描寫敘述能夠發(fā)現(xiàn),之所以Toast的顯示交由遠程的NotificationManagerService管理是由于Toast是每一個應(yīng)用程序都會彈出的,并且位置和UI風(fēng)格都差點兒相同。所以假設(shè)我們不統(tǒng)一管理就會出現(xiàn)覆蓋疊加現(xiàn)象,同一時候?qū)е虏缓每刂啤K訥oogle把Toast設(shè)計成為了系統(tǒng)級的窗體類型,由NotificationManagerService統(tǒng)一隊列管理。

    在我們開發(fā)應(yīng)用程序時使用Toast注意事項:

  • 通過分析TN類的handler能夠發(fā)現(xiàn),假設(shè)想在非UI線程使用Toast須要自行聲明Looper。否則運行會拋出Looper相關(guān)的異常;UI線程不須要,由于系統(tǒng)已經(jīng)幫忙聲明。

  • 在使用Toast時context參數(shù)盡量使用getApplicationContext()。能夠有效的防止靜態(tài)引用導(dǎo)致的內(nèi)存泄漏。

  • 有時候我們會發(fā)現(xiàn)Toast彈出過多就會延遲顯示。由于上面源代碼分析能夠看見Toast.makeText是一個靜態(tài)工廠方法,每次調(diào)用這種方法都會產(chǎn)生一個新的Toast對象,當(dāng)我們在這個新new的對象上調(diào)用show方法就會使這個對象加入到NotificationManagerService管理的mToastQueue消息顯示隊列里排隊等候顯示;所以假設(shè)我們不每次都產(chǎn)生一個新的Toast對象(使用單例來處理)就不須要排隊。也就能及時更新了。

  • 6 Android應(yīng)用Activity、Dialog、PopWindow、Toast窗體顯示機制總結(jié)

    能夠看見上面不管Acitivty、Dialog、PopWindow、Toast的實質(zhì)事實上都是例如以下接口提供的方法操作:

    public interface ViewManager {public void addView(View view, ViewGroup.LayoutParams params);public void updateViewLayout(View view, ViewGroup.LayoutParams params);public void removeView(View view); }

    整個應(yīng)用各種窗體的顯示都離不開這三個方法而已。僅僅是token及type與Window是否共用的問題。

    【工匠若水 http://blog.csdn.net/yanbober 轉(zhuǎn)載煩請注明出處,尊重勞動成果】

    總結(jié)

    以上是生活随笔為你收集整理的Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    久久精品无码一区二区三区 | 十八禁视频网站在线观看 | 久久久久成人精品免费播放动漫 | 欧美精品在线观看 | 国产人妻大战黑人第1集 | 秋霞成人午夜鲁丝一区二区三区 | 久久久精品欧美一区二区免费 | 少妇人妻偷人精品无码视频 | 2020久久超碰国产精品最新 | 黑人大群体交免费视频 | 日日天干夜夜狠狠爱 | 亚洲日韩av片在线观看 | 欧美人与牲动交xxxx | 亚洲日韩av一区二区三区四区 | 国内精品久久毛片一区二区 | 狠狠噜狠狠狠狠丁香五月 | 内射老妇bbwx0c0ck | 亚洲国产高清在线观看视频 | 成人女人看片免费视频放人 | 高潮喷水的毛片 | 国产精品久久久久7777 | 久久久久久a亚洲欧洲av冫 | 四虎影视成人永久免费观看视频 | 亚洲精品一区二区三区在线 | 亚洲码国产精品高潮在线 | 成人片黄网站色大片免费观看 | 熟妇人妻中文av无码 | 在线看片无码永久免费视频 | 国产精品国产三级国产专播 | 成人性做爰aaa片免费看 | 人人超人人超碰超国产 | 国产精品沙发午睡系列 | 日本欧美一区二区三区乱码 | 又大又紧又粉嫩18p少妇 | 国产精品久久久久久久影院 | 成人欧美一区二区三区黑人免费 | 人妻体内射精一区二区三四 | 黑人玩弄人妻中文在线 | 亚洲精品久久久久久久久久久 | 青草青草久热国产精品 | 国产 精品 自在自线 | 青青久在线视频免费观看 | 精品 日韩 国产 欧美 视频 | 性色欲情网站iwww九文堂 | 亚洲乱码中文字幕在线 | 亚洲va欧美va天堂v国产综合 | 久久久久99精品国产片 | 免费观看黄网站 | 香蕉久久久久久av成人 | 99riav国产精品视频 | 人妻熟女一区 | 十八禁真人啪啪免费网站 | 久久亚洲a片com人成 | 久久人妻内射无码一区三区 | 一区二区三区乱码在线 | 欧洲 | 乌克兰少妇xxxx做受 | 免费乱码人妻系列无码专区 | 麻豆果冻传媒2021精品传媒一区下载 | 欧美乱妇无乱码大黄a片 | 日韩人妻无码一区二区三区久久99 | 一区二区三区高清视频一 | 两性色午夜免费视频 | 国产亚洲精品久久久ai换 | 国产午夜亚洲精品不卡下载 | 99麻豆久久久国产精品免费 | 国产极品美女高潮无套在线观看 | 中文字幕av无码一区二区三区电影 | 国产精品香蕉在线观看 | 99久久久无码国产aaa精品 | 日日碰狠狠丁香久燥 | 中文字幕无码日韩专区 | 国产麻豆精品精东影业av网站 | 老头边吃奶边弄进去呻吟 | 丰满人妻被黑人猛烈进入 | 亚洲欧美中文字幕5发布 | 亚洲熟悉妇女xxx妇女av | 国产精品美女久久久久av爽李琼 | 人妻天天爽夜夜爽一区二区 | 激情内射日本一区二区三区 | 国产九九九九九九九a片 | 88国产精品欧美一区二区三区 | 色综合久久久无码中文字幕 | 曰本女人与公拘交酡免费视频 | 又粗又大又硬又长又爽 | 曰韩无码二三区中文字幕 | 国产亚av手机在线观看 | 国产农村乱对白刺激视频 | 久久国产精品_国产精品 | 日韩亚洲欧美中文高清在线 | 亚洲 另类 在线 欧美 制服 | 成人免费视频在线观看 | 亚洲国产精品无码久久久久高潮 | 一二三四社区在线中文视频 | 奇米影视7777久久精品人人爽 | 久久精品女人的天堂av | 亚洲精品午夜无码电影网 | 国产成人av免费观看 | 少妇太爽了在线观看 | 成人性做爰aaa片免费看不忠 | 欧美乱妇无乱码大黄a片 | 久久国产精品萌白酱免费 | 免费视频欧美无人区码 | 国产精品高潮呻吟av久久4虎 | 久久午夜夜伦鲁鲁片无码免费 | 国产农村妇女高潮大叫 | 奇米影视888欧美在线观看 | 日韩欧美成人免费观看 | 日本www一道久久久免费榴莲 | 久久www免费人成人片 | 中文字幕日韩精品一区二区三区 | 精品国偷自产在线视频 | 欧美一区二区三区 | 免费观看又污又黄的网站 | 国产av无码专区亚洲awww | 丰满人妻翻云覆雨呻吟视频 | 亚洲日本va午夜在线电影 | 亚洲午夜无码久久 | 野外少妇愉情中文字幕 | 久久亚洲中文字幕无码 | 亚洲精品午夜国产va久久成人 | 色妞www精品免费视频 | 在线看片无码永久免费视频 | 毛片内射-百度 | 鲁一鲁av2019在线 | 免费无码一区二区三区蜜桃大 | 99精品无人区乱码1区2区3区 | 狠狠色欧美亚洲狠狠色www | 欧美成人免费全部网站 | 香蕉久久久久久av成人 | 欧美大屁股xxxxhd黑色 | 老子影院午夜精品无码 | 亚洲男人av香蕉爽爽爽爽 | 妺妺窝人体色www婷婷 | 国产人妻精品一区二区三区不卡 | 无码av最新清无码专区吞精 | 国产精品久久久久9999小说 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产成人午夜福利在线播放 | 曰本女人与公拘交酡免费视频 | 国产国产精品人在线视 | 国产猛烈高潮尖叫视频免费 | 美女黄网站人色视频免费国产 | a国产一区二区免费入口 | 国产成人av免费观看 | 色欲综合久久中文字幕网 | 熟女体下毛毛黑森林 | 国产又粗又硬又大爽黄老大爷视 | 99久久精品日本一区二区免费 | 久久精品女人天堂av免费观看 | 蜜臀av无码人妻精品 | 亚洲人成网站在线播放942 | 亚洲精品国产第一综合99久久 | 亚洲中文字幕久久无码 | 国产乱码精品一品二品 | 久久亚洲精品中文字幕无男同 | 女人被男人躁得好爽免费视频 | 麻花豆传媒剧国产免费mv在线 | 激情内射亚州一区二区三区爱妻 | 波多野结衣av在线观看 | 亚洲成av人综合在线观看 | 内射欧美老妇wbb | 国产在线一区二区三区四区五区 | 一本久久a久久精品亚洲 | 天天做天天爱天天爽综合网 | 精品无码国产一区二区三区av | 国产偷国产偷精品高清尤物 | 国产成人无码午夜视频在线观看 | 亚洲天堂2017无码中文 | 国产精品99久久精品爆乳 | 国产高清不卡无码视频 | 高潮毛片无遮挡高清免费视频 | 国产美女极度色诱视频www | 国产成人精品一区二区在线小狼 | 国产三级精品三级男人的天堂 | 欧美 日韩 人妻 高清 中文 | 久久综合狠狠综合久久综合88 | 国产午夜亚洲精品不卡下载 | 久热国产vs视频在线观看 | 国产亚洲人成a在线v网站 | 欧美刺激性大交 | 老子影院午夜伦不卡 | 欧美色就是色 | 欧美变态另类xxxx | 国产成人午夜福利在线播放 | 精品夜夜澡人妻无码av蜜桃 | 久久人人97超碰a片精品 | 免费观看激色视频网站 | 欧美人妻一区二区三区 | 久久无码专区国产精品s | 无遮无挡爽爽免费视频 | 国产成人精品久久亚洲高清不卡 | 日韩人妻无码一区二区三区久久99 | 狠狠噜狠狠狠狠丁香五月 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 天堂亚洲免费视频 | 荫蒂被男人添的好舒服爽免费视频 | 两性色午夜免费视频 | 国产午夜精品一区二区三区嫩草 | 久久这里只有精品视频9 | 欧美35页视频在线观看 | 欧美人与动性行为视频 | 西西人体www44rt大胆高清 | 精品国产乱码久久久久乱码 | 理论片87福利理论电影 | 少妇厨房愉情理9仑片视频 | 性欧美疯狂xxxxbbbb | 国产亚av手机在线观看 | 午夜理论片yy44880影院 | 99视频精品全部免费免费观看 | 国产免费久久精品国产传媒 | 久久综合给合久久狠狠狠97色 | 欧美日韩综合一区二区三区 | 夫妻免费无码v看片 | 特黄特色大片免费播放器图片 | 九九久久精品国产免费看小说 | 国产成人无码专区 | 亚洲熟熟妇xxxx | 久久国语露脸国产精品电影 | 大乳丰满人妻中文字幕日本 | 亚洲中文字幕无码中字 | 免费看男女做好爽好硬视频 | 亚洲综合无码久久精品综合 | 亚洲色偷偷偷综合网 | 久久亚洲中文字幕精品一区 | 国产午夜视频在线观看 | 日本精品久久久久中文字幕 | 久久天天躁夜夜躁狠狠 | av在线亚洲欧洲日产一区二区 | 国产做国产爱免费视频 | 国语精品一区二区三区 | 人人妻人人澡人人爽人人精品浪潮 | 亚洲欧美综合区丁香五月小说 | 麻豆果冻传媒2021精品传媒一区下载 | 精品人妻中文字幕有码在线 | 欧美人与善在线com | 国产精品久久久久7777 | 一个人看的www免费视频在线观看 | 国产美女精品一区二区三区 | 香蕉久久久久久av成人 | 鲁大师影院在线观看 | 日韩精品a片一区二区三区妖精 | 人人妻人人澡人人爽人人精品 | 久久久久成人片免费观看蜜芽 | 99久久精品日本一区二区免费 | 国产精品资源一区二区 | 精品国产成人一区二区三区 | 精品国产av色一区二区深夜久久 | 丰满少妇弄高潮了www | 日韩av无码中文无码电影 | 久久人人爽人人爽人人片av高清 | 一二三四社区在线中文视频 | 最新国产麻豆aⅴ精品无码 | 欧美人妻一区二区三区 | 久久精品人人做人人综合试看 | 国产网红无码精品视频 | 欧美午夜特黄aaaaaa片 | 久久久久久久女国产乱让韩 | 亚洲熟妇色xxxxx欧美老妇 | 夜夜影院未满十八勿进 | 天堂亚洲2017在线观看 | 国产美女精品一区二区三区 | 色婷婷av一区二区三区之红樱桃 | 精品日本一区二区三区在线观看 | 大地资源网第二页免费观看 | 国产97色在线 | 免 | 午夜精品久久久久久久 | 国产成人无码a区在线观看视频app | 无套内谢老熟女 | 亚洲欧美日韩国产精品一区二区 | 爽爽影院免费观看 | 爱做久久久久久 | 欧美 日韩 人妻 高清 中文 | 中文字幕av伊人av无码av | 草草网站影院白丝内射 | 亚洲国产精品成人久久蜜臀 | 中文无码精品a∨在线观看不卡 | 国产舌乚八伦偷品w中 | 激情五月综合色婷婷一区二区 | 300部国产真实乱 | 最新国产乱人伦偷精品免费网站 | 欧美黑人巨大xxxxx | 午夜男女很黄的视频 | 欧美人与禽zoz0性伦交 | 蜜桃臀无码内射一区二区三区 | 国产免费无码一区二区视频 | 亚洲乱码日产精品bd | 国内精品人妻无码久久久影院 | 欧美兽交xxxx×视频 | 久青草影院在线观看国产 | 东京热无码av男人的天堂 | 成人三级无码视频在线观看 | 久久婷婷五月综合色国产香蕉 | 国产精品丝袜黑色高跟鞋 | 欧美第一黄网免费网站 | 宝宝好涨水快流出来免费视频 | 国产精品99爱免费视频 | 国产精品福利视频导航 | 国产精品无码成人午夜电影 | 成人av无码一区二区三区 | 久久婷婷五月综合色国产香蕉 | 九月婷婷人人澡人人添人人爽 | 国产一区二区三区日韩精品 | 2019午夜福利不卡片在线 | 性欧美疯狂xxxxbbbb | 亚洲国产综合无码一区 | 女人和拘做爰正片视频 | 国产福利视频一区二区 | 丰满岳乱妇在线观看中字无码 | 亚洲熟悉妇女xxx妇女av | 亚洲 另类 在线 欧美 制服 | 天下第一社区视频www日本 | 三上悠亚人妻中文字幕在线 | 小泽玛莉亚一区二区视频在线 | 久久久中文久久久无码 | 国产综合久久久久鬼色 | 国内精品九九久久久精品 | 久久久成人毛片无码 | 中文字幕乱码人妻二区三区 | 无码精品国产va在线观看dvd | 荫蒂添的好舒服视频囗交 | 久久久久久久女国产乱让韩 | 国产成人无码午夜视频在线观看 | 国内精品人妻无码久久久影院 | 久久国语露脸国产精品电影 | 少妇性俱乐部纵欲狂欢电影 | aⅴ在线视频男人的天堂 | 日韩在线不卡免费视频一区 | 国产艳妇av在线观看果冻传媒 | 国产精品igao视频网 | 国产亚洲精品久久久久久久 | 国产福利视频一区二区 | 激情内射亚州一区二区三区爱妻 | 又大又紧又粉嫩18p少妇 | 亚洲国产精品一区二区第一页 | 蜜桃无码一区二区三区 | 亚洲毛片av日韩av无码 | 久久久中文久久久无码 | 成人无码精品1区2区3区免费看 | 亚洲精品一区二区三区在线观看 | 久久综合给久久狠狠97色 | 免费人成网站视频在线观看 | 夜夜躁日日躁狠狠久久av | 欧美人妻一区二区三区 | 国产av无码专区亚洲a∨毛片 | 国产日产欧产精品精品app | 人妻无码αv中文字幕久久琪琪布 | 成人免费视频在线观看 | 亚洲春色在线视频 | 国产后入清纯学生妹 | 亚洲第一无码av无码专区 | 老熟妇仑乱视频一区二区 | 最近的中文字幕在线看视频 | 国产亚洲视频中文字幕97精品 | 激情五月综合色婷婷一区二区 | 99国产精品白浆在线观看免费 | 无码福利日韩神码福利片 | 亚洲爆乳精品无码一区二区三区 | 乱人伦人妻中文字幕无码久久网 | 国产激情无码一区二区app | 一本色道久久综合亚洲精品不卡 | 国产莉萝无码av在线播放 | 婷婷五月综合缴情在线视频 | 久久精品99久久香蕉国产色戒 | 老熟女重囗味hdxx69 | 午夜无码人妻av大片色欲 | 亚洲成a人片在线观看日本 | 啦啦啦www在线观看免费视频 | 无码av最新清无码专区吞精 | 性史性农村dvd毛片 | 久久视频在线观看精品 | 久久www免费人成人片 | 欧美老人巨大xxxx做受 | 色五月丁香五月综合五月 | 无人区乱码一区二区三区 | 性做久久久久久久久 | 任你躁国产自任一区二区三区 | 精品国产麻豆免费人成网站 | 99久久人妻精品免费一区 | 精品偷自拍另类在线观看 | 精品一区二区三区波多野结衣 | 一本加勒比波多野结衣 | 成人精品天堂一区二区三区 | 又紧又大又爽精品一区二区 | 久久精品国产99精品亚洲 | 久久精品国产99久久6动漫 | 理论片87福利理论电影 | 东京无码熟妇人妻av在线网址 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 日韩欧美成人免费观看 | 亚洲色成人中文字幕网站 | 亚洲理论电影在线观看 | 欧美激情内射喷水高潮 | 国产av人人夜夜澡人人爽麻豆 | 久久综合给合久久狠狠狠97色 | 俺去俺来也在线www色官网 | 色一情一乱一伦一视频免费看 | 大地资源网第二页免费观看 | 夜夜影院未满十八勿进 | 1000部夫妻午夜免费 | 欧美xxxxx精品 | 性生交大片免费看女人按摩摩 | 欧美freesex黑人又粗又大 | 麻豆蜜桃av蜜臀av色欲av | www一区二区www免费 | 欧美freesex黑人又粗又大 | 女人被男人爽到呻吟的视频 | 国产午夜无码精品免费看 | 性欧美牲交xxxxx视频 | 免费男性肉肉影院 | 久久久久久a亚洲欧洲av冫 | 亚洲日本一区二区三区在线 | 亚洲日韩精品欧美一区二区 | 久久精品成人欧美大片 | 色婷婷香蕉在线一区二区 | 日本一卡2卡3卡四卡精品网站 | 青春草在线视频免费观看 | 国产乱子伦视频在线播放 | av无码久久久久不卡免费网站 | 国产亚洲人成在线播放 | 国产无av码在线观看 | 亚洲中文字幕乱码av波多ji | 国产真实伦对白全集 | 国产 精品 自在自线 | 无码人妻黑人中文字幕 | 国产suv精品一区二区五 | 久久国语露脸国产精品电影 | 久久aⅴ免费观看 | 少妇一晚三次一区二区三区 | 波多野结衣一区二区三区av免费 | 亚洲国产精品美女久久久久 | 中文字幕人妻无码一夲道 | 午夜理论片yy44880影院 | 国产精品a成v人在线播放 | 2019午夜福利不卡片在线 | 久久久久se色偷偷亚洲精品av | 欧美激情综合亚洲一二区 | 国产 浪潮av性色四虎 | 久久综合狠狠综合久久综合88 | 亚洲日韩av一区二区三区四区 | 亚洲国产一区二区三区在线观看 | 欧美日韩综合一区二区三区 | 日韩在线不卡免费视频一区 | 欧美国产亚洲日韩在线二区 | 丰满岳乱妇在线观看中字无码 | 亚洲人成人无码网www国产 | 鲁大师影院在线观看 | 亚洲欧洲中文日韩av乱码 | 亚洲成a人片在线观看无码3d | 欧美黑人巨大xxxxx | 国产精品亚洲一区二区三区喷水 | 亚洲一区二区三区四区 | 色五月五月丁香亚洲综合网 | 欧美日韩综合一区二区三区 | 水蜜桃亚洲一二三四在线 | 国产成人精品无码播放 | 99精品视频在线观看免费 | 日日碰狠狠躁久久躁蜜桃 | 51国偷自产一区二区三区 | 精品国产精品久久一区免费式 | 男女超爽视频免费播放 | 国产午夜精品一区二区三区嫩草 | 粉嫩少妇内射浓精videos | 国内精品一区二区三区不卡 | 国产精品美女久久久 | 久久久亚洲欧洲日产国码αv | 亚洲伊人久久精品影院 | 久久亚洲日韩精品一区二区三区 | 牲欲强的熟妇农村老妇女 | 欧美日韩综合一区二区三区 | 日日碰狠狠躁久久躁蜜桃 | 小泽玛莉亚一区二区视频在线 | 精品人人妻人人澡人人爽人人 | 99久久婷婷国产综合精品青草免费 | 国产综合色产在线精品 | 女人被爽到呻吟gif动态图视看 | 国产精品久久久久无码av色戒 | 老熟妇乱子伦牲交视频 | 日本一区二区三区免费高清 | 国产亚洲精品久久久久久久久动漫 | 亚洲日本一区二区三区在线 | 人妻与老人中文字幕 | 无码一区二区三区在线 | 丰腴饱满的极品熟妇 | 中文字幕人成乱码熟女app | 日韩精品无码一本二本三本色 | 国产免费久久久久久无码 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲精品久久久久avwww潮水 | 性欧美videos高清精品 | 国产 精品 自在自线 | 日本在线高清不卡免费播放 | 一个人看的www免费视频在线观看 | 亚洲 a v无 码免 费 成 人 a v | 色欲久久久天天天综合网精品 | 日本护士xxxxhd少妇 | 粉嫩少妇内射浓精videos | 国产亚洲精品久久久久久大师 | 国产精品18久久久久久麻辣 | 樱花草在线播放免费中文 | 久久无码人妻影院 | 国模大胆一区二区三区 | 欧美freesex黑人又粗又大 | 在线视频网站www色 | 亚洲色欲色欲天天天www | 欧美阿v高清资源不卡在线播放 | 久久99久久99精品中文字幕 | 97资源共享在线视频 | 中文字幕精品av一区二区五区 | 女人被爽到呻吟gif动态图视看 | 久久精品一区二区三区四区 | 男女下面进入的视频免费午夜 | 日本大香伊一区二区三区 | 中文字幕色婷婷在线视频 | 中文字幕人妻无码一区二区三区 | 欧美老妇交乱视频在线观看 | 国产成人无码av一区二区 | 中文字幕精品av一区二区五区 | 国产成人无码一二三区视频 | 无码毛片视频一区二区本码 | 久久综合九色综合97网 | 精品人妻人人做人人爽 | 国产xxx69麻豆国语对白 | 天天做天天爱天天爽综合网 | 欧美三级a做爰在线观看 | av在线亚洲欧洲日产一区二区 | 奇米影视888欧美在线观看 | 亚洲精品国产品国语在线观看 | 精品国偷自产在线视频 | 亚洲熟妇色xxxxx欧美老妇y | 中文字幕日韩精品一区二区三区 | 国产精品爱久久久久久久 | 成熟人妻av无码专区 | 高清国产亚洲精品自在久久 | 国产又爽又黄又刺激的视频 | 300部国产真实乱 | 老子影院午夜精品无码 | 国产精品va在线播放 | 欧洲vodafone精品性 | 性欧美牲交在线视频 | 亚洲欧美综合区丁香五月小说 | 国产熟妇另类久久久久 | 天堂在线观看www | 性色欲网站人妻丰满中文久久不卡 | 中国大陆精品视频xxxx | 精品一区二区不卡无码av | 亚洲小说春色综合另类 | 亚洲男女内射在线播放 | 色妞www精品免费视频 | 98国产精品综合一区二区三区 | 97资源共享在线视频 | 精品国产一区二区三区av 性色 | 国语精品一区二区三区 | 婷婷色婷婷开心五月四房播播 | 97资源共享在线视频 | 大胆欧美熟妇xx | 自拍偷自拍亚洲精品被多人伦好爽 | 55夜色66夜色国产精品视频 | 国产免费久久精品国产传媒 | 又粗又大又硬毛片免费看 | 激情综合激情五月俺也去 | 久久伊人色av天堂九九小黄鸭 | 成人精品一区二区三区中文字幕 | 国产精品久久久久久无码 | 亚洲男女内射在线播放 | 少妇性俱乐部纵欲狂欢电影 | 日本www一道久久久免费榴莲 | ass日本丰满熟妇pics | 亚洲精品午夜无码电影网 | 最近免费中文字幕中文高清百度 | 中文字幕日韩精品一区二区三区 | 国产熟妇另类久久久久 | av无码久久久久不卡免费网站 | 人人妻人人澡人人爽精品欧美 | а天堂中文在线官网 | 日本www一道久久久免费榴莲 | 国产精品人妻一区二区三区四 | 鲁大师影院在线观看 | 亚无码乱人伦一区二区 | 熟妇人妻激情偷爽文 | 日韩欧美中文字幕公布 | 国产成人精品一区二区在线小狼 | 青青久在线视频免费观看 | 四虎影视成人永久免费观看视频 | 黑人巨大精品欧美黑寡妇 | 全黄性性激高免费视频 | 国产av无码专区亚洲awww | а√资源新版在线天堂 | 久久精品女人天堂av免费观看 | 兔费看少妇性l交大片免费 | 国产 浪潮av性色四虎 | 国产97色在线 | 免 | 欧美 丝袜 自拍 制服 另类 | 99久久人妻精品免费一区 | 色综合久久88色综合天天 | 色综合久久久无码网中文 | 成人无码精品1区2区3区免费看 | 色婷婷久久一区二区三区麻豆 | 亚洲乱码国产乱码精品精 | 亚洲国产一区二区三区在线观看 | 理论片87福利理论电影 | 免费人成在线视频无码 | 色婷婷综合中文久久一本 | 国产精品亚洲综合色区韩国 | 狠狠色噜噜狠狠狠狠7777米奇 | 一个人看的www免费视频在线观看 | 波多野结衣乳巨码无在线观看 | 久久99精品久久久久久动态图 | 99视频精品全部免费免费观看 | 伊在人天堂亚洲香蕉精品区 | 性色av无码免费一区二区三区 | 青青草原综合久久大伊人精品 | 中文无码精品a∨在线观看不卡 | 国产精品亚洲五月天高清 | 高清国产亚洲精品自在久久 | 日本xxxx色视频在线观看免费 | 荫蒂添的好舒服视频囗交 | 久久久久av无码免费网 | 国产特级毛片aaaaaaa高清 | 久久精品丝袜高跟鞋 | 国色天香社区在线视频 | 国产精品毛多多水多 | 国产精品久久久久9999小说 | 国产区女主播在线观看 | 免费无码av一区二区 | 荫蒂被男人添的好舒服爽免费视频 | 成人综合网亚洲伊人 | 日本饥渴人妻欲求不满 | 国产国产精品人在线视 | 乌克兰少妇性做爰 | 乱码av麻豆丝袜熟女系列 | 精品无码成人片一区二区98 | 久久精品中文闷骚内射 | 久久久国产一区二区三区 | 欧美性猛交内射兽交老熟妇 | 永久免费观看国产裸体美女 | 99久久婷婷国产综合精品青草免费 | 精品一区二区三区无码免费视频 | 亚洲国产精品一区二区第一页 | 高潮毛片无遮挡高清免费 | 四虎国产精品免费久久 | 99久久精品国产一区二区蜜芽 | 国产真实夫妇视频 | 蜜臀av无码人妻精品 | 爽爽影院免费观看 | 99麻豆久久久国产精品免费 | 国内揄拍国内精品人妻 | 成人一区二区免费视频 | √8天堂资源地址中文在线 | 久精品国产欧美亚洲色aⅴ大片 | 日本饥渴人妻欲求不满 | 无码一区二区三区在线观看 | 麻豆av传媒蜜桃天美传媒 | 亚洲精品国产品国语在线观看 | 国产乡下妇女做爰 | 午夜免费福利小电影 | 亚洲一区二区三区国产精华液 | 伊人久久婷婷五月综合97色 | 欧美 亚洲 国产 另类 | 最近免费中文字幕中文高清百度 | 久久久精品国产sm最大网站 | 欧美国产日韩久久mv | 国产亚洲人成a在线v网站 | 偷窥日本少妇撒尿chinese | 亚洲国产欧美在线成人 | 亚洲热妇无码av在线播放 | 76少妇精品导航 | 中文字幕无码av激情不卡 | 国产农村乱对白刺激视频 | 欧美野外疯狂做受xxxx高潮 | 亚洲综合无码久久精品综合 | 久久久精品成人免费观看 | www国产亚洲精品久久网站 | 日产精品99久久久久久 | 欧美性生交xxxxx久久久 | 高清国产亚洲精品自在久久 | 国产三级精品三级男人的天堂 | 永久免费观看国产裸体美女 | 天天拍夜夜添久久精品大 | 九九在线中文字幕无码 | 爆乳一区二区三区无码 | 国产精品人人爽人人做我的可爱 | 亚无码乱人伦一区二区 | 亚洲日本一区二区三区在线 | 2019午夜福利不卡片在线 | 成人欧美一区二区三区黑人免费 | 啦啦啦www在线观看免费视频 | 精品水蜜桃久久久久久久 | 国产精品久久久午夜夜伦鲁鲁 | 无码任你躁久久久久久久 | 中文字幕乱码亚洲无线三区 | 丰满岳乱妇在线观看中字无码 | 亚洲精品久久久久久一区二区 | 亚洲精品久久久久久一区二区 | 久久久久久久人妻无码中文字幕爆 | 亚洲 高清 成人 动漫 | 激情国产av做激情国产爱 | 亚洲综合另类小说色区 | 欧美丰满老熟妇xxxxx性 | 中文字幕日韩精品一区二区三区 | 波多野结衣av一区二区全免费观看 | 中文字幕无码免费久久9一区9 | 中文无码伦av中文字幕 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 欧美亚洲国产一区二区三区 | 欧洲熟妇精品视频 | 无码纯肉视频在线观看 | 少妇无码av无码专区在线观看 | 精品国产一区二区三区av 性色 | 无码中文字幕色专区 | 无码成人精品区在线观看 | 老熟女乱子伦 | 丰满岳乱妇在线观看中字无码 | 久久99精品国产麻豆蜜芽 | 大地资源网第二页免费观看 | 蜜桃臀无码内射一区二区三区 | 久久久精品欧美一区二区免费 | 久久aⅴ免费观看 | 领导边摸边吃奶边做爽在线观看 | 国产黄在线观看免费观看不卡 | 色情久久久av熟女人妻网站 | 国产在线精品一区二区高清不卡 | 日韩成人一区二区三区在线观看 | 国产精品a成v人在线播放 | 国产成人综合美国十次 | 在线观看国产一区二区三区 | 自拍偷自拍亚洲精品10p | 亚洲精品一区二区三区婷婷月 | 婷婷丁香五月天综合东京热 | 国产人妻精品一区二区三区 | 亚洲一区二区三区播放 | 国产小呦泬泬99精品 | 国产精品无码一区二区桃花视频 | 少妇无码一区二区二三区 | 男人扒开女人内裤强吻桶进去 | 97人妻精品一区二区三区 | 无码纯肉视频在线观看 | 国产内射爽爽大片视频社区在线 | 日本肉体xxxx裸交 | 成人精品一区二区三区中文字幕 | 国产一区二区三区精品视频 | 女人色极品影院 | 天堂а√在线地址中文在线 | 最近免费中文字幕中文高清百度 | 色综合久久久久综合一本到桃花网 | 国语精品一区二区三区 | 波多野结衣一区二区三区av免费 | 亚洲 日韩 欧美 成人 在线观看 | 欧美激情内射喷水高潮 | 中文字幕无线码免费人妻 | 亚洲国产精品一区二区美利坚 | 久久久久99精品成人片 | 国色天香社区在线视频 | 波多野结衣一区二区三区av免费 | 国产精品多人p群无码 | av香港经典三级级 在线 | 无码av免费一区二区三区试看 | 四十如虎的丰满熟妇啪啪 | 精品久久久久久亚洲精品 | 国内精品久久久久久中文字幕 | 夜夜影院未满十八勿进 | 日日躁夜夜躁狠狠躁 | 日本一区二区三区免费高清 | 一本色道久久综合亚洲精品不卡 | 久久久久se色偷偷亚洲精品av | 久久精品女人天堂av免费观看 | 亚洲小说春色综合另类 | 美女张开腿让人桶 | 久久无码中文字幕免费影院蜜桃 | 又大又紧又粉嫩18p少妇 | 亚洲日本一区二区三区在线 | 国产网红无码精品视频 | 中文字幕无码av激情不卡 | 精品无码国产自产拍在线观看蜜 | 国产莉萝无码av在线播放 | 亚洲自偷精品视频自拍 | 2020久久超碰国产精品最新 | 免费无码午夜福利片69 | 国产精品怡红院永久免费 | 国产av一区二区精品久久凹凸 | 蜜桃av抽搐高潮一区二区 | 无码精品国产va在线观看dvd | 精品无码av一区二区三区 | 欧洲极品少妇 | 国产亚洲精品精品国产亚洲综合 | 波多野结衣一区二区三区av免费 | 精品久久久久久亚洲精品 | 国内少妇偷人精品视频 | 日本精品少妇一区二区三区 | 欧美熟妇另类久久久久久不卡 | 久久国产精品精品国产色婷婷 | 人人爽人人爽人人片av亚洲 | 四虎影视成人永久免费观看视频 | 国内少妇偷人精品视频 | 国产精品无码永久免费888 | 精品厕所偷拍各类美女tp嘘嘘 | 日本乱偷人妻中文字幕 | 人人妻人人澡人人爽精品欧美 | 国产无套粉嫩白浆在线 | 久久五月精品中文字幕 | 51国偷自产一区二区三区 | 无码人妻av免费一区二区三区 | 无码午夜成人1000部免费视频 | 图片小说视频一区二区 | 久久精品无码一区二区三区 | 色婷婷欧美在线播放内射 | 亚洲国产欧美国产综合一区 | 亚洲码国产精品高潮在线 | 色狠狠av一区二区三区 | 久久精品中文闷骚内射 | 亚洲人成网站在线播放942 | 欧美刺激性大交 | 欧美第一黄网免费网站 | 色综合久久久无码网中文 | 乌克兰少妇xxxx做受 | 澳门永久av免费网站 | 强伦人妻一区二区三区视频18 | 老司机亚洲精品影院 | 欧美成人午夜精品久久久 | √天堂资源地址中文在线 | 300部国产真实乱 | 一本久道久久综合婷婷五月 | 国精产品一区二区三区 | 图片区 小说区 区 亚洲五月 | 欧美 丝袜 自拍 制服 另类 | 波多野结衣 黑人 | 国产两女互慰高潮视频在线观看 | 麻豆蜜桃av蜜臀av色欲av | 亚洲精品午夜无码电影网 | 无码精品人妻一区二区三区av | 亚洲中文字幕在线无码一区二区 | 131美女爱做视频 | 欧美肥老太牲交大战 | 综合网日日天干夜夜久久 | 波多野结衣乳巨码无在线观看 | 内射后入在线观看一区 | 高潮毛片无遮挡高清免费 | 久久五月精品中文字幕 | 日日鲁鲁鲁夜夜爽爽狠狠 | 日本一卡2卡3卡四卡精品网站 | 久久亚洲精品成人无码 | 日本熟妇乱子伦xxxx | av人摸人人人澡人人超碰下载 | 麻豆国产人妻欲求不满 | 久久伊人色av天堂九九小黄鸭 | 女人色极品影院 | 亚洲毛片av日韩av无码 | 日欧一片内射va在线影院 | www国产亚洲精品久久网站 | www国产亚洲精品久久久日本 | 国产免费久久久久久无码 | 乱码午夜-极国产极内射 | 少妇被粗大的猛进出69影院 | 亚洲色在线无码国产精品不卡 | 无码av免费一区二区三区试看 | 亚洲色大成网站www | 影音先锋中文字幕无码 | 国产熟女一区二区三区四区五区 | 亚洲色在线无码国产精品不卡 | 精品亚洲韩国一区二区三区 | 久久天天躁夜夜躁狠狠 | 国产另类ts人妖一区二区 | 麻豆国产丝袜白领秘书在线观看 | 人妻与老人中文字幕 | 久久伊人色av天堂九九小黄鸭 | 亚洲七七久久桃花影院 | 成在人线av无码免费 | 久久久久亚洲精品中文字幕 | 人妻少妇被猛烈进入中文字幕 | 特大黑人娇小亚洲女 | 国产精品无码永久免费888 | 无码任你躁久久久久久久 | 中文无码精品a∨在线观看不卡 | 领导边摸边吃奶边做爽在线观看 | 伊人久久大香线焦av综合影院 | 97无码免费人妻超级碰碰夜夜 | 亚洲欧美色中文字幕在线 | 中文字幕人妻丝袜二区 | 国产黄在线观看免费观看不卡 | 在线精品亚洲一区二区 | 国产va免费精品观看 | 国产成人无码专区 | 亚洲精品无码人妻无码 | 国产成人无码av在线影院 | 亚洲中文字幕久久无码 | 国产真人无遮挡作爱免费视频 | 国产精品手机免费 | 天天拍夜夜添久久精品 | 久久国产精品_国产精品 | 丰满护士巨好爽好大乳 | 国产成人一区二区三区在线观看 | 精品日本一区二区三区在线观看 | 中文字幕av伊人av无码av | 亚洲日韩av一区二区三区四区 | 久久精品人妻少妇一区二区三区 | 久久久久av无码免费网 | 国产熟女一区二区三区四区五区 | 精品成人av一区二区三区 | 伊人久久大香线焦av综合影院 | 99久久无码一区人妻 | 日韩人妻少妇一区二区三区 | 国产亚洲美女精品久久久2020 | 岛国片人妻三上悠亚 | 国产人妻精品午夜福利免费 | 一本无码人妻在中文字幕免费 | 无码人妻出轨黑人中文字幕 | 无码福利日韩神码福利片 | 亚洲无人区午夜福利码高清完整版 | 国产黄在线观看免费观看不卡 | 亚洲码国产精品高潮在线 | 成人性做爰aaa片免费看不忠 | aⅴ亚洲 日韩 色 图网站 播放 | 久久久婷婷五月亚洲97号色 | 日韩精品a片一区二区三区妖精 | 乌克兰少妇xxxx做受 | 在线亚洲高清揄拍自拍一品区 | 偷窥日本少妇撒尿chinese | 久久综合香蕉国产蜜臀av | 久久午夜无码鲁丝片秋霞 | 国产激情无码一区二区 | 亚洲色在线无码国产精品不卡 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 亚洲欧美综合区丁香五月小说 | 欧美丰满少妇xxxx性 | 国产精品久久国产精品99 | 亚洲男人av香蕉爽爽爽爽 | 粗大的内捧猛烈进出视频 | 丰满诱人的人妻3 | 日韩精品久久久肉伦网站 | 色综合视频一区二区三区 | 无人区乱码一区二区三区 | 人人澡人人妻人人爽人人蜜桃 | 小sao货水好多真紧h无码视频 | v一区无码内射国产 | 中文字幕日韩精品一区二区三区 | 爽爽影院免费观看 | 欧美日韩视频无码一区二区三 | 宝宝好涨水快流出来免费视频 | 国产精品久久久午夜夜伦鲁鲁 | 奇米影视7777久久精品人人爽 | 欧美老熟妇乱xxxxx | 精品国产麻豆免费人成网站 | 国产电影无码午夜在线播放 | 熟妇女人妻丰满少妇中文字幕 | 性色av无码免费一区二区三区 | 丝袜人妻一区二区三区 | 无码av免费一区二区三区试看 | 成人无码视频在线观看网站 | 18禁黄网站男男禁片免费观看 | 精品久久久无码中文字幕 | 国产办公室秘书无码精品99 | 黑人玩弄人妻中文在线 | 在教室伦流澡到高潮hnp视频 | 久久久精品456亚洲影院 | 真人与拘做受免费视频 | 国产成人人人97超碰超爽8 | 国产无av码在线观看 | 真人与拘做受免费视频一 | 欧美人妻一区二区三区 | 成人影院yy111111在线观看 | 中文字幕无码免费久久9一区9 | 18无码粉嫩小泬无套在线观看 | av在线亚洲欧洲日产一区二区 | 欧洲精品码一区二区三区免费看 | 中文字幕人妻无码一夲道 | 日韩成人一区二区三区在线观看 | 中国女人内谢69xxxxxa片 | 人人妻人人澡人人爽欧美一区 | 中文字幕精品av一区二区五区 | 国产午夜无码视频在线观看 | 亚洲一区二区三区含羞草 | 亚洲无人区一区二区三区 | 18禁止看的免费污网站 | 国产一区二区三区精品视频 | 日韩人妻无码中文字幕视频 | 欧美日韩一区二区三区自拍 | 成人无码影片精品久久久 | 正在播放东北夫妻内射 | 午夜精品一区二区三区在线观看 | 亚洲大尺度无码无码专区 | 性史性农村dvd毛片 | 亚洲欧洲中文日韩av乱码 | 国产欧美精品一区二区三区 | 白嫩日本少妇做爰 | 久久aⅴ免费观看 | 成人片黄网站色大片免费观看 | 动漫av网站免费观看 | 亚洲一区二区三区在线观看网站 | 亚洲午夜久久久影院 | 亚洲熟妇色xxxxx欧美老妇 | 无码人妻精品一区二区三区不卡 | 国产人妻精品午夜福利免费 | 国产成人精品一区二区在线小狼 | 久久精品中文字幕大胸 | 岛国片人妻三上悠亚 | 色婷婷av一区二区三区之红樱桃 | 男女性色大片免费网站 | www国产亚洲精品久久久日本 | 国产成人无码a区在线观看视频app | 国产电影无码午夜在线播放 | 又色又爽又黄的美女裸体网站 | 亚洲欧洲中文日韩av乱码 | 亚洲一区二区三区含羞草 | 日韩精品乱码av一区二区 | 好爽又高潮了毛片免费下载 | 国产精品亚洲综合色区韩国 | 97无码免费人妻超级碰碰夜夜 | 亚洲欧美日韩国产精品一区二区 | 亲嘴扒胸摸屁股激烈网站 | 国产亚洲欧美在线专区 | 欧洲vodafone精品性 | 精品无码国产一区二区三区av | 任你躁国产自任一区二区三区 | 大地资源中文第3页 | 人人妻人人澡人人爽精品欧美 | 极品嫩模高潮叫床 | 女人色极品影院 | 成人影院yy111111在线观看 | 国产精品毛多多水多 | 狠狠色欧美亚洲狠狠色www | 国产精品99久久精品爆乳 | 国产精品亚洲五月天高清 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 大肉大捧一进一出好爽视频 | 精品人人妻人人澡人人爽人人 | 少妇性俱乐部纵欲狂欢电影 | 好爽又高潮了毛片免费下载 | 2019午夜福利不卡片在线 | 亚洲爆乳大丰满无码专区 | 国产精品手机免费 | 亚洲国产成人av在线观看 | 1000部夫妻午夜免费 | 久久国产精品偷任你爽任你 | 精品乱子伦一区二区三区 | 久久国产精品_国产精品 | 色综合久久久无码网中文 | 精品人妻av区 | 日韩精品久久久肉伦网站 | 老头边吃奶边弄进去呻吟 | 熟女俱乐部五十路六十路av | 九九热爱视频精品 | 亚洲综合伊人久久大杳蕉 | 青草青草久热国产精品 | 天堂а√在线地址中文在线 | 无码av最新清无码专区吞精 | 亚洲综合精品香蕉久久网 | 色五月丁香五月综合五月 | 国内揄拍国内精品少妇国语 | 扒开双腿疯狂进出爽爽爽视频 | 日日天干夜夜狠狠爱 | 久久综合九色综合97网 | 成人精品一区二区三区中文字幕 | 国产精品久久久久久亚洲毛片 | 亚洲综合无码久久精品综合 | 久久国内精品自在自线 | 中文字幕乱码人妻二区三区 | 丁香花在线影院观看在线播放 | 欧美丰满熟妇xxxx性ppx人交 | 女人被男人躁得好爽免费视频 | 午夜精品久久久内射近拍高清 | 久久久国产精品无码免费专区 | 麻花豆传媒剧国产免费mv在线 | 久久久久久a亚洲欧洲av冫 | 国产成人综合在线女婷五月99播放 | 亚洲の无码国产の无码步美 | 国产精品a成v人在线播放 | 无码av岛国片在线播放 | 日本va欧美va欧美va精品 | 久久综合久久自在自线精品自 | 人人妻人人澡人人爽精品欧美 | 少妇高潮喷潮久久久影院 | 亚洲 a v无 码免 费 成 人 a v | 欧美野外疯狂做受xxxx高潮 | 亚洲国产精品无码一区二区三区 | 综合人妻久久一区二区精品 | 国产色视频一区二区三区 | 成人无码视频在线观看网站 | 亚洲国精产品一二二线 | 在线 国产 欧美 亚洲 天堂 | 思思久久99热只有频精品66 | 日产精品99久久久久久 | 亚洲精品久久久久中文第一幕 | 国产高潮视频在线观看 | 欧美日韩人成综合在线播放 | 麻豆果冻传媒2021精品传媒一区下载 | 天天做天天爱天天爽综合网 | 国产无套内射久久久国产 | 久久久久久久人妻无码中文字幕爆 | 亚洲精品无码人妻无码 | 久久精品国产99精品亚洲 | 久久人人爽人人爽人人片av高清 | 最新国产乱人伦偷精品免费网站 | 中文无码精品a∨在线观看不卡 | 秋霞成人午夜鲁丝一区二区三区 | 国产内射老熟女aaaa | 国语精品一区二区三区 | 久久久久av无码免费网 | 日本免费一区二区三区最新 | 日本一卡2卡3卡四卡精品网站 | 亚洲综合无码久久精品综合 | 鲁鲁鲁爽爽爽在线视频观看 | 蜜桃臀无码内射一区二区三区 | 强伦人妻一区二区三区视频18 | 国模大胆一区二区三区 | 日韩视频 中文字幕 视频一区 | 国产性生交xxxxx无码 | 亚洲色欲色欲欲www在线 | 亚洲日本va中文字幕 | 无码国产乱人伦偷精品视频 | 99视频精品全部免费免费观看 | 色偷偷人人澡人人爽人人模 | 18精品久久久无码午夜福利 | 亚洲精品久久久久久一区二区 | 综合网日日天干夜夜久久 | 亚洲va中文字幕无码久久不卡 | 永久黄网站色视频免费直播 | 国产午夜福利100集发布 | 亚洲国产成人av在线观看 | 欧美老人巨大xxxx做受 | 精品国产乱码久久久久乱码 | 国产一区二区三区四区五区加勒比 | 精品久久久久香蕉网 | 精品偷拍一区二区三区在线看 | 午夜免费福利小电影 | 人妻插b视频一区二区三区 | 国产三级久久久精品麻豆三级 | 免费人成在线观看网站 | 亚洲 欧美 激情 小说 另类 | 波多野结衣av一区二区全免费观看 | 国产午夜精品一区二区三区嫩草 | 国产卡一卡二卡三 | 久久精品国产精品国产精品污 | 伊人久久大香线蕉av一区二区 | 成人欧美一区二区三区 | 国产精品亚洲а∨无码播放麻豆 | 人妻无码αv中文字幕久久琪琪布 | 熟妇激情内射com | 国产精品永久免费视频 | 久久综合色之久久综合 | 丰满护士巨好爽好大乳 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 欧美日本日韩 | 国产在线精品一区二区三区直播 | 国产三级精品三级男人的天堂 | 欧美猛少妇色xxxxx | 18黄暴禁片在线观看 | 国产激情艳情在线看视频 | 国产精品a成v人在线播放 | 粗大的内捧猛烈进出视频 | 狠狠色噜噜狠狠狠狠7777米奇 | 综合激情五月综合激情五月激情1 | 亚洲自偷自偷在线制服 | 无码乱肉视频免费大全合集 | 熟女体下毛毛黑森林 | 99久久精品午夜一区二区 | 人妻少妇精品久久 | 全黄性性激高免费视频 | 欧美激情一区二区三区成人 | 久久亚洲中文字幕无码 | 国产精品久久久久久久9999 | 欧美日韩在线亚洲综合国产人 | 扒开双腿疯狂进出爽爽爽视频 | 97资源共享在线视频 | 少妇无码av无码专区在线观看 | aⅴ在线视频男人的天堂 | 国产激情精品一区二区三区 | ass日本丰满熟妇pics | 亚洲精品国产品国语在线观看 | 国产乱子伦视频在线播放 | 色一情一乱一伦一区二区三欧美 | 亚洲精品午夜国产va久久成人 | 性欧美牲交在线视频 | 中文字幕无码热在线视频 | 亚洲日韩av一区二区三区四区 | 久久久久国色av免费观看性色 | 欧美放荡的少妇 | 久久久久免费精品国产 | 国产在线aaa片一区二区99 | 美女极度色诱视频国产 | 欧美三级不卡在线观看 | 兔费看少妇性l交大片免费 | 中国大陆精品视频xxxx | 久久99热只有频精品8 | 国产成人无码av片在线观看不卡 | 久久www免费人成人片 | 水蜜桃亚洲一二三四在线 | 欧洲精品码一区二区三区免费看 | 精品熟女少妇av免费观看 | 欧美亚洲日韩国产人成在线播放 | 黑人玩弄人妻中文在线 | 欧美精品在线观看 | 无码任你躁久久久久久久 | 亚洲一区二区三区国产精华液 | 婷婷色婷婷开心五月四房播播 | 亲嘴扒胸摸屁股激烈网站 | 桃花色综合影院 | 男人和女人高潮免费网站 | 亚洲人交乣女bbw | 国产无遮挡又黄又爽免费视频 | 精品一区二区三区无码免费视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产精品毛多多水多 | 国产成人久久精品流白浆 | 中文字幕无码热在线视频 | 亚洲熟妇色xxxxx欧美老妇y | 少妇人妻大乳在线视频 | 无遮挡啪啪摇乳动态图 | 久久无码中文字幕免费影院蜜桃 | 精品无码一区二区三区的天堂 | 秋霞成人午夜鲁丝一区二区三区 | 高中生自慰www网站 | 亚洲国产成人a精品不卡在线 | 亚洲午夜久久久影院 | 免费无码av一区二区 | 亚洲色欲久久久综合网东京热 | 99久久精品国产一区二区蜜芽 | 无码纯肉视频在线观看 | 精品国产av色一区二区深夜久久 | 国精品人妻无码一区二区三区蜜柚 | 131美女爱做视频 | 国产乡下妇女做爰 | 在线播放亚洲第一字幕 | 丰腴饱满的极品熟妇 | 久久精品女人天堂av免费观看 | 色老头在线一区二区三区 | 欧美丰满少妇xxxx性 | 青草青草久热国产精品 | 欧美日韩在线亚洲综合国产人 | 国产人妻久久精品二区三区老狼 | 波多野结衣乳巨码无在线观看 | 小sao货水好多真紧h无码视频 | 日本欧美一区二区三区乱码 | 扒开双腿吃奶呻吟做受视频 | 国产精品-区区久久久狼 | 国产精品第一区揄拍无码 | 亚洲午夜福利在线观看 | 久久久久久久女国产乱让韩 | 国产精品人妻一区二区三区四 | 无码人妻精品一区二区三区不卡 | 亚洲精品中文字幕 | 亚洲精品欧美二区三区中文字幕 | 丰满人妻被黑人猛烈进入 | 色婷婷av一区二区三区之红樱桃 | 国产精品亚洲lv粉色 | 欧美老妇与禽交 | 人妻少妇精品无码专区二区 | 中文字幕人妻无码一区二区三区 | 男人的天堂av网站 | 久久天天躁夜夜躁狠狠 | 免费播放一区二区三区 | 天海翼激烈高潮到腰振不止 | 国产亚洲欧美在线专区 | 国产又爽又猛又粗的视频a片 | 影音先锋中文字幕无码 | 久久国产精品偷任你爽任你 | 日韩欧美中文字幕在线三区 | 久久久久亚洲精品男人的天堂 | 无码一区二区三区在线观看 | 国产婷婷色一区二区三区在线 | 国内丰满熟女出轨videos | 无遮挡啪啪摇乳动态图 | 国产成人无码av片在线观看不卡 | 欧美zoozzooz性欧美 | v一区无码内射国产 | 日本高清一区免费中文视频 | 无码福利日韩神码福利片 | 亚洲性无码av中文字幕 | 亚洲 日韩 欧美 成人 在线观看 | 欧美熟妇另类久久久久久多毛 | 国产婷婷色一区二区三区在线 | 性欧美videos高清精品 | 午夜福利电影 | 黑森林福利视频导航 | 国产色精品久久人妻 | 国产在线一区二区三区四区五区 | 国产精品亚洲专区无码不卡 | 色欲综合久久中文字幕网 | yw尤物av无码国产在线观看 | 日本一区二区三区免费播放 | 亚洲成色在线综合网站 | 久久久久久久久888 | 丁香花在线影院观看在线播放 | 欧美日韩久久久精品a片 | 麻豆蜜桃av蜜臀av色欲av | 男人的天堂av网站 | 国产成人无码一二三区视频 | 老太婆性杂交欧美肥老太 | 久久久久成人片免费观看蜜芽 | 啦啦啦www在线观看免费视频 | 欧洲极品少妇 | 亚洲精品久久久久avwww潮水 | 中文亚洲成a人片在线观看 | 国内丰满熟女出轨videos | 精品厕所偷拍各类美女tp嘘嘘 | 2020最新国产自产精品 | 久久人人爽人人人人片 | 亚洲小说图区综合在线 | 国产午夜无码视频在线观看 | 性生交大片免费看l | 亚洲国产一区二区三区在线观看 | 国产成人精品一区二区在线小狼 | 人妻夜夜爽天天爽三区 | 丰满人妻精品国产99aⅴ | 2020久久超碰国产精品最新 | 亚洲欧美国产精品久久 | 无码午夜成人1000部免费视频 | 亚洲精品国产第一综合99久久 | 99久久亚洲精品无码毛片 | 丰满肥臀大屁股熟妇激情视频 | 国产精品va在线播放 | 99久久99久久免费精品蜜桃 | 狠狠色丁香久久婷婷综合五月 | 亚洲小说春色综合另类 | 成人无码视频在线观看网站 | 国内精品九九久久久精品 | 日本精品人妻无码77777 天堂一区人妻无码 | 免费无码午夜福利片69 | 玩弄少妇高潮ⅹxxxyw | 人妻熟女一区 | 性色av无码免费一区二区三区 | 国产人妻人伦精品1国产丝袜 | 久久久av男人的天堂 | 国产偷抇久久精品a片69 | 少妇无码一区二区二三区 | 国产精品无码成人午夜电影 | 亚洲精品久久久久avwww潮水 | 天天做天天爱天天爽综合网 | 一二三四在线观看免费视频 | 伊人久久婷婷五月综合97色 | 妺妺窝人体色www在线小说 | 97精品国产97久久久久久免费 | 国产精品毛片一区二区 | 亚洲欧美色中文字幕在线 | 国产一精品一av一免费 | 在线播放亚洲第一字幕 | 亚洲精品一区二区三区四区五区 | 蜜臀av无码人妻精品 | 人人澡人人透人人爽 | 漂亮人妻洗澡被公强 日日躁 | 久久综合久久自在自线精品自 | 国产特级毛片aaaaaa高潮流水 | 2019nv天堂香蕉在线观看 | av人摸人人人澡人人超碰下载 | 理论片87福利理论电影 | 丰满诱人的人妻3 | 中文字幕乱码中文乱码51精品 | 免费播放一区二区三区 | 午夜理论片yy44880影院 | 国产一精品一av一免费 | 一本精品99久久精品77 | 色诱久久久久综合网ywww | 国产精品久久久久7777 | 少妇人妻av毛片在线看 | 波多野结衣av一区二区全免费观看 | 狠狠色噜噜狠狠狠狠7777米奇 | 伊人久久婷婷五月综合97色 | 少妇性l交大片欧洲热妇乱xxx | 狠狠色欧美亚洲狠狠色www | 无人区乱码一区二区三区 | 日韩少妇内射免费播放 | 高潮毛片无遮挡高清免费 | 老熟女乱子伦 | 成 人影片 免费观看 | 精品成在人线av无码免费看 | 未满小14洗澡无码视频网站 | 国产精品va在线播放 | 成人精品天堂一区二区三区 | 亚洲国产日韩a在线播放 | 精品人人妻人人澡人人爽人人 | 国产福利视频一区二区 | 国产性生交xxxxx无码 | 麻豆国产97在线 | 欧洲 | 亚洲欧洲中文日韩av乱码 | 国产亚洲欧美日韩亚洲中文色 | 亚洲一区二区三区四区 | 又大又硬又爽免费视频 | 中文字幕av日韩精品一区二区 | 日日天日日夜日日摸 | 色综合久久久久综合一本到桃花网 | 久久伊人色av天堂九九小黄鸭 | 亚洲成av人在线观看网址 | 精品无码一区二区三区的天堂 | yw尤物av无码国产在线观看 | 99久久亚洲精品无码毛片 | 男人扒开女人内裤强吻桶进去 | 伊在人天堂亚洲香蕉精品区 | 性欧美熟妇videofreesex | 九月婷婷人人澡人人添人人爽 | 亚洲色大成网站www国产 | 两性色午夜免费视频 | 无码国产乱人伦偷精品视频 | 狠狠噜狠狠狠狠丁香五月 | 激情内射日本一区二区三区 | 国精品人妻无码一区二区三区蜜柚 | 国产成人精品优优av | 成人无码视频在线观看网站 | 国产无av码在线观看 | 亚洲欧洲中文日韩av乱码 | 欧美日本免费一区二区三区 | 色窝窝无码一区二区三区色欲 | 国产黑色丝袜在线播放 | 男人扒开女人内裤强吻桶进去 | 国产亚洲精品久久久久久久久动漫 | 亚洲人成人无码网www国产 | 午夜精品一区二区三区的区别 | 亚洲中文字幕无码中文字在线 | 啦啦啦www在线观看免费视频 | a国产一区二区免费入口 | 99久久精品午夜一区二区 | 久久久久se色偷偷亚洲精品av | 强奷人妻日本中文字幕 | 精品久久久久久人妻无码中文字幕 | 国产九九九九九九九a片 | 久久精品一区二区三区四区 | 国产亚洲日韩欧美另类第八页 | 国产亚洲精品精品国产亚洲综合 | 欧美人与善在线com | 丝袜人妻一区二区三区 | 午夜熟女插插xx免费视频 | 久久99精品国产麻豆 | 亚洲人成网站免费播放 | 亚洲国产精品一区二区第一页 | 成年美女黄网站色大免费视频 | 日韩在线不卡免费视频一区 | 又粗又大又硬毛片免费看 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲欧美色中文字幕在线 | 久久久久亚洲精品中文字幕 | 色偷偷人人澡人人爽人人模 | 男女超爽视频免费播放 | 国产精品久久久久久久影院 | 强开小婷嫩苞又嫩又紧视频 | 在线观看欧美一区二区三区 | 99久久久国产精品无码免费 | 亚洲综合无码一区二区三区 | 人妻aⅴ无码一区二区三区 | 精品久久8x国产免费观看 | 国产成人一区二区三区别 | 国产内射爽爽大片视频社区在线 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲日韩av一区二区三区中文 | 2020久久超碰国产精品最新 | 狠狠亚洲超碰狼人久久 | 国产精品va在线播放 | 亚洲中文字幕乱码av波多ji | 一个人看的www免费视频在线观看 | 精品国精品国产自在久国产87 | 4hu四虎永久在线观看 | 亚洲男女内射在线播放 | 少妇性l交大片欧洲热妇乱xxx | 永久免费观看国产裸体美女 | 色一情一乱一伦一区二区三欧美 | 欧洲精品码一区二区三区免费看 | 国产精品高潮呻吟av久久 | 亚洲精品国产精品乱码视色 | 水蜜桃色314在线观看 | 亚洲综合伊人久久大杳蕉 | 国产人妻精品一区二区三区不卡 | 曰韩少妇内射免费播放 | 色综合天天综合狠狠爱 | 国产极品美女高潮无套在线观看 | 欧美日韩在线亚洲综合国产人 | 少妇一晚三次一区二区三区 | 高潮毛片无遮挡高清免费视频 | 性欧美牲交在线视频 | 欧美 丝袜 自拍 制服 另类 | 亚洲国产精品一区二区第一页 | 国产九九九九九九九a片 | 久久精品国产一区二区三区肥胖 | 一本久久伊人热热精品中文字幕 | 蜜臀aⅴ国产精品久久久国产老师 | 波多野结衣乳巨码无在线观看 | 激情五月综合色婷婷一区二区 | 久久久精品成人免费观看 | 99久久亚洲精品无码毛片 | 日日天日日夜日日摸 | 亚洲中文无码av永久不收费 | 1000部夫妻午夜免费 | 国产成人综合在线女婷五月99播放 | 强奷人妻日本中文字幕 | 男女猛烈xx00免费视频试看 | 天天拍夜夜添久久精品大 | 国产亚洲人成a在线v网站 | 狂野欧美激情性xxxx | 在线观看欧美一区二区三区 | 中文精品久久久久人妻不卡 | 亚洲熟女一区二区三区 | 色综合久久久久综合一本到桃花网 | 欧美丰满少妇xxxx性 | 天堂一区人妻无码 | 国内丰满熟女出轨videos | 中文字幕日产无线码一区 | 性史性农村dvd毛片 | 欧美丰满熟妇xxxx | 蜜桃视频插满18在线观看 | 丝袜 中出 制服 人妻 美腿 | 在线播放亚洲第一字幕 | 日韩精品无码一本二本三本色 | 蜜桃av抽搐高潮一区二区 | 亚洲色在线无码国产精品不卡 | 国产真实伦对白全集 | 精品国产一区av天美传媒 | 免费人成在线观看网站 | 精品久久综合1区2区3区激情 | 乱人伦中文视频在线观看 | 99在线 | 亚洲 | 亚洲人成网站在线播放942 | 久久亚洲中文字幕无码 | 国产无遮挡吃胸膜奶免费看 | 无套内谢的新婚少妇国语播放 | 成人无码精品一区二区三区 | 东京一本一道一二三区 | 亚洲色www成人永久网址 | 欧美丰满熟妇xxxx性ppx人交 | 精品国产av色一区二区深夜久久 | 亚洲精品久久久久中文第一幕 | 成人免费视频视频在线观看 免费 | 久久综合色之久久综合 | 理论片87福利理论电影 | 无码国产乱人伦偷精品视频 | 在线播放免费人成毛片乱码 | 99久久精品午夜一区二区 | 欧美人与动性行为视频 | 国产成人精品视频ⅴa片软件竹菊 | 国产精品久久久久久久影院 | 成人精品一区二区三区中文字幕 | 玩弄少妇高潮ⅹxxxyw | 巨爆乳无码视频在线观看 | 久久亚洲中文字幕精品一区 | 色偷偷人人澡人人爽人人模 | 无码国模国产在线观看 | 色综合久久88色综合天天 | 综合网日日天干夜夜久久 | 国产午夜无码视频在线观看 | 精品国产av色一区二区深夜久久 | 成人无码精品1区2区3区免费看 | 久久国产劲爆∧v内射 | 伊人久久婷婷五月综合97色 | 中文无码精品a∨在线观看不卡 | 亚洲乱码国产乱码精品精 | 少女韩国电视剧在线观看完整 | 亚洲国产精品久久久天堂 | 亚洲中文字幕乱码av波多ji | 免费人成在线观看网站 | 1000部啪啪未满十八勿入下载 | 鲁大师影院在线观看 | 精品水蜜桃久久久久久久 | 国产激情精品一区二区三区 | 国产精品成人av在线观看 | 成人亚洲精品久久久久 | 九九在线中文字幕无码 | 亚洲成a人片在线观看无码 | 特黄特色大片免费播放器图片 | 国产又爽又猛又粗的视频a片 | 中文字幕乱码人妻二区三区 | 欧美国产日韩久久mv | 欧美日韩久久久精品a片 | 亚洲色成人中文字幕网站 | 免费网站看v片在线18禁无码 | 亚洲另类伦春色综合小说 | 在线观看免费人成视频 | 国产av一区二区三区最新精品 | 76少妇精品导航 | 免费无码的av片在线观看 | 亚洲精品久久久久avwww潮水 | 国产九九九九九九九a片 | 国产在线精品一区二区高清不卡 | 日韩在线不卡免费视频一区 | 欧美熟妇另类久久久久久不卡 | 日本大香伊一区二区三区 | 无码人妻少妇伦在线电影 | 帮老师解开蕾丝奶罩吸乳网站 | 5858s亚洲色大成网站www | 国产亚av手机在线观看 | 久久精品人妻少妇一区二区三区 | 欧美丰满熟妇xxxx性ppx人交 | 永久免费观看美女裸体的网站 | 成人女人看片免费视频放人 | 国产成人一区二区三区在线观看 | 欧美日韩人成综合在线播放 | 欧美日韩色另类综合 | 国产综合久久久久鬼色 | 麻豆果冻传媒2021精品传媒一区下载 | 色五月丁香五月综合五月 | 欧美国产日韩亚洲中文 | 国精品人妻无码一区二区三区蜜柚 | 国产乱人伦偷精品视频 | 久久精品丝袜高跟鞋 | 国产精品久免费的黄网站 | 99麻豆久久久国产精品免费 | 午夜福利一区二区三区在线观看 | 人人妻人人澡人人爽人人精品 | 色五月五月丁香亚洲综合网 | 国产三级精品三级男人的天堂 | 疯狂三人交性欧美 | 在线视频网站www色 | 最近中文2019字幕第二页 | 无码任你躁久久久久久久 | 国产无套粉嫩白浆在线 | 欧美刺激性大交 | 无码纯肉视频在线观看 | 男女超爽视频免费播放 | 久久99精品久久久久婷婷 | 亚洲精品中文字幕 | 夜夜影院未满十八勿进 | 狠狠色丁香久久婷婷综合五月 | 久久天天躁狠狠躁夜夜免费观看 | 成人欧美一区二区三区黑人免费 | 日本一区二区更新不卡 | 亚洲伊人久久精品影院 | 国产午夜亚洲精品不卡下载 | 日本精品人妻无码77777 天堂一区人妻无码 | 成人亚洲精品久久久久软件 | 欧美日韩在线亚洲综合国产人 | 亚洲欧美精品伊人久久 | 日韩精品一区二区av在线 | 动漫av一区二区在线观看 | 国产成人无码av在线影院 | 日韩av激情在线观看 | 亚洲中文字幕乱码av波多ji | 亚洲一区二区三区播放 | 一本色道久久综合狠狠躁 | 日韩 欧美 动漫 国产 制服 | 亚洲色大成网站www国产 | 俺去俺来也在线www色官网 | 日产精品高潮呻吟av久久 | 国产精品沙发午睡系列 | 欧美午夜特黄aaaaaa片 | 理论片87福利理论电影 | 伊人久久大香线蕉av一区二区 | 55夜色66夜色国产精品视频 | 学生妹亚洲一区二区 | 国产凸凹视频一区二区 | 天堂亚洲2017在线观看 | 精品一区二区三区无码免费视频 | 国产成人精品无码播放 | 久久久久久久女国产乱让韩 | 男女超爽视频免费播放 | 国产亚洲精品精品国产亚洲综合 | 自拍偷自拍亚洲精品被多人伦好爽 | 久久久国产一区二区三区 | 国产午夜亚洲精品不卡下载 | 亚洲人成影院在线观看 | 亚洲日韩一区二区三区 | 久青草影院在线观看国产 | 日韩欧美群交p片內射中文 | 网友自拍区视频精品 | 国产成人午夜福利在线播放 | 亚洲精品国产精品乱码不卡 | 熟女少妇人妻中文字幕 | 强开小婷嫩苞又嫩又紧视频 | 亚洲乱码中文字幕在线 | 人人妻人人澡人人爽人人精品浪潮 | 欧美xxxxx精品 | 精品成人av一区二区三区 | 亚洲成av人片在线观看无码不卡 | 天堂亚洲2017在线观看 | 欧美人与动性行为视频 | 无码人妻精品一区二区三区不卡 | 欧美日韩精品 | 国内揄拍国内精品人妻 | 成 人 免费观看网站 | 少女韩国电视剧在线观看完整 | 一本久道高清无码视频 | 麻豆国产97在线 | 欧洲 | 中文字幕乱码亚洲无线三区 | 国产亚洲日韩欧美另类第八页 | 亚洲精品美女久久久久久久 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 黄网在线观看免费网站 | 国产精品久久久久7777 | 亚洲第一网站男人都懂 | 亚洲男人av香蕉爽爽爽爽 | 青青青爽视频在线观看 | 秋霞成人午夜鲁丝一区二区三区 | 人妻少妇精品无码专区动漫 | 欧美丰满熟妇xxxx性ppx人交 |