国产无遮挡裸体免费直播视频,久久精品国产蜜臀av,动漫在线视频一区二区,欧亚日韩一区二区三区,久艹在线 免费视频,国产精品美女网站免费,正在播放 97超级视频在线观看,斗破苍穹年番在线观看免费,51最新乱码中文字幕

WindowManagerService服務(wù)是如何以堆棧的形式來組織窗口

 更新時間:2013年01月22日 09:50:35   作者:  
我們知道,在Android系統(tǒng)中,Activity是以堆棧的形式組織在ActivityManagerService服務(wù)中的;在本文中,我們就詳細(xì)分析WindowManagerService服務(wù)是如何以堆棧的形式來組織窗口的

我們知道,在Android系統(tǒng)中,Activity是以堆棧的形式組織在ActivityManagerService服務(wù)中的。與Activity類似,Android系統(tǒng)中的窗口也是以堆棧的形式組織在WindowManagerService服務(wù)中的,其中,Z軸位置較低的窗口位于Z軸位置較高的窗口的下面。在本文中,我們就詳細(xì)分析WindowManagerService服務(wù)是如何以堆棧的形式來組織窗口的。

從前面Android應(yīng)用程序啟動過程源代碼分析一文可以知道,應(yīng)用程序進(jìn)程中的每一個Activity組件在Activity管理服務(wù)ActivityManagerService中都對應(yīng)有一個ActivityRecord對象。從前面Android應(yīng)用程序窗口(Activity)與WindowManagerService服務(wù)的連接過程分析一文又可以知道,Activity管理服務(wù)ActivityManagerService中每一個ActivityRecord對象在Window管理服務(wù)WindowManagerService中都對應(yīng)有一個AppWindowToken對象。

此外,在輸入法管理服務(wù)InputMethodManagerService中,每一個輸入法窗口都對應(yīng)有一個Binder對象,這個Binder對象在Window管理服務(wù)WindowManagerService又對應(yīng)有一個WindowToken對象。

與輸入法窗口類似,在壁紙管理服務(wù)WallpaperManagerService中,每一個壁紙窗口都對應(yīng)有一個Binder對象,這個Binder對象在Window管理服務(wù)WindowManagerService也對應(yīng)有一個WindowToken對象。

在Window管理服務(wù)WindowManagerService中,無論是AppWindowToken對象,還是WindowToken對象,它們都是用來描述一組有著相同令牌的窗口的,每一個窗口都是通過一個WindowState對象來描述的。例如,一個Activity組件窗口可能有一個啟動窗口(Starting Window),還有若干個子窗口,那么這些窗口就會組成一組,并且都是以Activity組件在Window管理服務(wù)WindowManagerService中所對應(yīng)的AppWindowToken對象為令牌的。從抽象的角度來看,就是在Window管理服務(wù)WindowManagerService中,每一個令牌(AppWindowToken或者WindowToken)都是用來描述一組窗口(WindowState)的,并且每一個窗口的子窗口也是與它同屬于一個組,即都有著相同的令牌。

上述的窗口組織方式如圖1所示:


圖1 窗口在WindowManagerService服務(wù)中的組織方式

其中,Activity Stack是在ActivityManagerService服務(wù)中創(chuàng)建的,Token List和Window Stack是在WindowManagerService中創(chuàng)建的,而Binder for IM和Binder for WP分別是在InputMethodManagerService服務(wù)和WallpaperManagerService服務(wù)中創(chuàng)建的,用來描述一個輸入法窗口和一個壁紙窗口。

圖1中的對象的對應(yīng)關(guān)系如下所示:

1. ActivityRecord-J對應(yīng)于AppWindowToken-J,后者描述的一組窗口是{WindowState-A, WindowState-B, WindowState-B-1},其中, WindowState-B-1是WindowState-B的子窗口。

2. ActivityRecord-K對應(yīng)于AppWindowToken-K,后者描述的一組窗口是{WindowState-C, WindowState-C-1, WindowState-D, WindowState-D-1},其中, WindowState-C-1是WindowState-C的子窗口,WindowState-D-1是WindowState-D的子窗口。

3. ActivityRecord-N對應(yīng)于AppWindowToken-N,后者描述的一組窗口是{WindowState-E},其中, WindowState-E是系統(tǒng)當(dāng)前激活的Activity窗口。

4. Binder for IM對應(yīng)于WindowToken-I,后者描述的一組窗口是{WindowState-I},其中, WindowState-I是WindowState-E的輸入法窗口。

5. Binder for WP對應(yīng)于WindowToken-W,后者描述的一組窗口是{WindowState-W},其中, WindowState-W是WindowState-E的壁紙窗口。

從圖1還可以知道,Window Stack中的WindowState是按照它們所描述的窗口的Z軸位置從低到高排列的。

以上就是WindowManagerService服務(wù)組織系統(tǒng)中的窗口的抽象模型,接下來我們將分析AppWindowToken、WindowToken和WindowState的一些增加、移動和刪除等操作,以便可以對這個抽象模型有一個更深刻的認(rèn)識。

1.  增加AppWindowToken

從前面Android應(yīng)用程序窗口(Activity)與WindowManagerService服務(wù)的連接過程分析一文可以知道,一個Activity組件在啟動的過程中,ActivityManagerService服務(wù)會調(diào)用調(diào)用WindowManagerService類的成員函數(shù)addAppToken來為它增加一個AppWindowToken,如下所示:

復(fù)制代碼 代碼如下:

public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor {
......

/**
* Mapping from a token IBinder to a WindowToken object.
*/
final HashMap<IBinder, WindowToken> mTokenMap =
new HashMap<IBinder, WindowToken>();

/**
* The same tokens as mTokenMap, stored in a list for efficient iteration
* over them.
*/
final ArrayList<WindowToken> mTokenList = new ArrayList<WindowToken>();
......

/**
* Z-ordered (bottom-most first) list of all application tokens, for
* controlling the ordering of windows in different applications. This
* contains WindowToken objects.
*/
final ArrayList<AppWindowToken> mAppTokens = new ArrayList<AppWindowToken>();
......

public void addAppToken(int addPos, IApplicationToken token,
int groupId, int requestedOrientation, boolean fullscreen) {
......

synchronized(mWindowMap) {
AppWindowToken wtoken = findAppWindowToken(token.asBinder());
if (wtoken != null) {
......
return;
}
wtoken = new AppWindowToken(token);
......
mAppTokens.add(addPos, wtoken);
......
mTokenMap.put(token.asBinder(), wtoken);
mTokenList.add(wtoken);

......
}
}

......
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

WindowManagerService類有三個成員變量mTokenMap、mTokenList和mAppTokens,它們都是用來描述系統(tǒng)中的窗口的。

成員變量mTokenMap指向的是一個HashMap,它里面保存的是一系列的WindowToken對象,每一個WindowToken對象都是用來描述一個窗口的,并且是以描述這些窗口的一個Binder對象的IBinder接口為鍵值的。例如,對于Activity組件類型的窗口來說,它們分別是以用來描述它們的一個ActivityRecord對象的IBinder接口保存在成員變量mTokenMap所指向的一個HashMap中的。

成員變量mTokenList指向的是一個ArrayList,它里面保存的也是一系列WindowToken對象,這些WindowToken對象與保存在成員變量mTokenMap所指向的一個HashMap中的WindowToken對象是一樣的。成員變量mTokenMap和成員變量mTokenList的區(qū)別就在于,前者在給定一個IBinder接口的情況下,可以迅速指出是否存在一個對應(yīng)的WindowToken對象,而后者可以迅速遍歷WindowManagerService服務(wù)中的WindowToken對象。

成員變量mAppTokens指向的也是一個ArrayList,不過它里面保存的是一系列AppWindowToken對象,每一個AppWindowToken對象都是用來描述一個Activity組件窗口的,而這些AppWindowToken對象是以它們描述的窗口的Z軸坐標(biāo)由小到大保存在這個ArrayList中的,這樣我們就可以通過這個ArrayList來從上到下或者從下到上地遍歷系統(tǒng)中的所有Activity組件窗口。由于這些AppWindowToken對象所描述的Activity組件窗口也是一個窗口,并且AppWindowToken類是從WindowToken繼承下來的,因此,這些AppWindowToken對象還會同時被保存在成員變量mTokenMap所指向的一個HashMap和成員變量mTokenList所指向的一個ArrayList中。

理解了WindowManagerService類的這三個成員變量的含義之后,它的成員函數(shù)addAppToken的實現(xiàn)就好理解了,其中,參數(shù)token指向的便是用來描述正在啟動的Activity組件所對應(yīng)的一個ActivityRecord對象,而參數(shù)addPos用來描述該Activity組件在堆棧中的位置,這個位置同時也是接下來要創(chuàng)建的AppWindowToken對象在WindowManagerService類的mTokenList所描述的一個ArrayList中的位置。

WindowManagerService類的成員函數(shù)addAppToken首先調(diào)用另外一個成員函數(shù)findAppWindowToken來在成員變量mTokenMap所描述的一個HashMap檢查是否已經(jīng)存在一個AppWindowToken。如果已經(jīng)存在的話,那么WindowManagerService類的成員函數(shù)addAppToken就什么也不做就返回了,否則的話,就會使用參數(shù)token來創(chuàng)建一個AppWindowToken對象,并且會將該AppWindowToken對象分別保存在WindowManagerService類的成員變量mTokenMap、mTokenList和mAppTokens中。

2. 刪除AppWindowToken

刪除AppWindowToken是通過調(diào)用WindowManagerService類的成員函數(shù)removeAppTokensLocked來實現(xiàn)的,如下所示:

復(fù)制代碼 代碼如下:

public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor {
......

private void removeAppTokensLocked(List<IBinder> tokens) {
// XXX This should be done more efficiently!
// (take advantage of the fact that both lists should be
// ordered in the same way.)
int N = tokens.size();
for (int i=0; i<N; i++) {
IBinder token = tokens.get(i);
final AppWindowToken wtoken = findAppWindowToken(token);
if (!mAppTokens.remove(wtoken)) {
......
i--;
N--;
}
}
}

......
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

WindowManagerService類的成員函數(shù)removeAppTokensLocked可以同時刪除一組AppWindowToken對象。

參數(shù)tokens所描述的是一個IBinder接口列表,與這些IBinder接口所對應(yīng)的AppWindowToken對象就是接下來要刪除的。WindowManagerService類的成員函數(shù)removeAppTokensLocked通過一個for循環(huán)來依次調(diào)用另外一個成員函數(shù)findAppWindowToken,以便可以找到保存在列表tokens中的每一個IBinder接口所對應(yīng)的AppWindowToken對象,然后將該AppWindowToken對象從WindowManagerService類的成員變量mAppTokens所描述的一個ArrayList中刪除。

注意,WindowManagerService類的成員函數(shù)removeAppTokensLocked是在內(nèi)部使用的,它只是把一個AppWindowToken對象從成員變量mAppTokens中刪除,而沒有從另外兩個成員變量mTokenMap和mTokenList中刪除。

3. 移動AppWindowToken至指定位置

移動AppWindowToken至指定位置是通過調(diào)用WindowManagerService類的成員函數(shù)moveAppToken來實現(xiàn)的,如下所示:

復(fù)制代碼 代碼如下:

public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor {
......

public void moveAppToken(int index, IBinder token) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"moveAppToken()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}

synchronized(mWindowMap) {
......
final AppWindowToken wtoken = findAppWindowToken(token);
if (wtoken == null || !mAppTokens.remove(wtoken)) {
......
return;
}
mAppTokens.add(index, wtoken);
......

final long origId = Binder.clearCallingIdentity();
......
if (tmpRemoveAppWindowsLocked(wtoken)) {
......
reAddAppWindowsLocked(findWindowOffsetLocked(index), wtoken);
......
updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES);
mLayoutNeeded = true;
performLayoutAndPlaceSurfacesLocked();
}
Binder.restoreCallingIdentity(origId);
}
}

......
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

參數(shù)token描述的是要移動的AppWindowToken對象所對應(yīng)的一個IBinder接口,而參數(shù)index描述的是該AppWindowToken對象要移動到的位置。注意,移動一個AppWindowToken對象到指定的位置是需要android.Manifest.permission.MANAGE_APP_TOKENS權(quán)限的。

WindowManagerService類的成員函數(shù)moveAppToken首先找到與參數(shù)token所對應(yīng)的AppWindowToken對象,并且將該AppWindowToken對象從WindowManagerService類的成員變量mAppTokens所描述的一個ArrayList中移除,這樣做的目的是為了接下來可以將該AppWindowToken對象移動至該ArrayList中的指定位置上,即參數(shù)index所描述的位置上。

注意,上述操作只是將參數(shù)token所對應(yīng)的AppWindowToken對象移動到了WindowManagerService類的成員變量mAppTokens所描述的一個ArrayList的指定位置上,接下來還需要同時將與該AppWindowToken對象所對應(yīng)的WindowState對象移動至WindowManagerService服務(wù)內(nèi)部的一個WindowState堆棧合適位置上去。

移動對應(yīng)的WindowState對象的操作同樣也是分兩步執(zhí)行的:第一步先調(diào)用WindowManagerService類的成員函數(shù)tmpRemoveAppWindowsLocked來將這些WindowState對象從原來的WindowState堆棧位置移除;第二步再調(diào)用WindowManagerService類的成員函數(shù)reAddAppWindowsLocked來將這些WindowState對象插入到WindowState堆棧的合適位置去。

對應(yīng)的WindowState對象被移動到的合適位置是通過調(diào)用WindowManagerService類的成員函數(shù)findWindowOffsetLocked來獲得的,它的實現(xiàn)如下所示:

復(fù)制代碼 代碼如下:

public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor {
......

/**
* Z-ordered (bottom-most first) list of all Window objects.
*/
final ArrayList<WindowState> mWindows = new ArrayList<WindowState>();
......

private int findWindowOffsetLocked(int tokenPos) {
final int NW = mWindows.size();

if (tokenPos >= mAppTokens.size()) {
int i = NW;
while (i > 0) {
i--;
WindowState win = mWindows.get(i);
if (win.getAppToken() != null) {
return i+1;
}
}
}

while (tokenPos > 0) {
// Find the first app token below the new position that has
// a window displayed.
final AppWindowToken wtoken = mAppTokens.get(tokenPos-1);
......
if (wtoken.sendingToBottom) {
......
tokenPos--;
continue;
}
int i = wtoken.windows.size();
while (i > 0) {
i--;
WindowState win = wtoken.windows.get(i);
int j = win.mChildWindows.size();
while (j > 0) {
j--;
WindowState cwin = win.mChildWindows.get(j);
if (cwin.mSubLayer >= 0) {
for (int pos=NW-1; pos>=0; pos--) {
if (mWindows.get(pos) == cwin) {
......
return pos+1;
}
}
}
}
for (int pos=NW-1; pos>=0; pos--) {
if (mWindows.get(pos) == win) {
......
return pos+1;
}
}
}
tokenPos--;
}

return 0;
}

......
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

參數(shù)tokenPos描述的是一個AppWindowToken對象在WindowManagerService類的成員變量mAppTokens所描述的一個ArrayList的位置,WindowManagerService類的成員函數(shù)findWindowOffsetLocked的目標(biāo)就要找到與該AppWindowToken對象所對應(yīng)的WindowState對象在WindowManagerService服務(wù)內(nèi)部的一個WindowState堆棧的起始偏移位置。有了這個起始偏移位置之后,我們就可以將對應(yīng)的所有WindowState對象有序地插入到該WindowState堆棧中去。WindowManagerService服務(wù)內(nèi)部的WindowState堆棧是通過WindowManagerService類的成員變量mWindows來描述的。接下來我們就分兩種情況來分析這個起始偏移位置的計算過程。

第一種情況是參數(shù)tokenPos的值大于WindowManagerService類的成員變量mAppTokens所描述的一個ArrayList的大小。這是一種異常情況,一般來說,參數(shù)tokenPos是指向mAppTokens列表的某一個位置的,不過這時候意味著它所描述的AppWindowToken對象的Z軸位置要大于mAppTokens列表的最上面的一個AppWindowToken對象的Z軸位置的。這也就是說,與參數(shù)tokenPos所描述的AppWindowToken對象所對應(yīng)的WindowState對象的要位于與mAppTokens列表的最上面的一個AppWindowToken對象所對應(yīng)的任一個WindoState對象的上面。因此,就需要找到與mAppTokens列表的最上面的一個AppWindowToken對象所對應(yīng)的Z軸位置最大的一個WindoState對象在WindowState堆棧中的位置i,然后就可以知道與參數(shù)tokenPos所描述的AppWindowToken對象所對應(yīng)的WindowState對象在WindowState堆棧的起始偏移位置為i+1。

如何找到mAppTokens列表的最上面的一個AppWindowToken對象所對應(yīng)的Z軸位置最大的一個WindoState對象在WindowState堆棧中的位置i呢?從圖1可以可得到一個結(jié)論:WindowManagerService服務(wù)內(nèi)部中的所有WindowState對象都是按照Z軸從位置從小到大排列在WindowState堆棧中的,并且在mAppTokens列表中,位于上面的一個AppWindowToken對象所對應(yīng)的那些WindowState對象的Z軸位置是一定大于位于下面的一個AppWindowToken對象所對應(yīng)的那些WindowState對象的Z軸位置的。因此,我們只要從WindowState堆棧的頂端開始往下遍歷,找到這樣的一個WindowState對象,它是屬于一個AppWindowToken對象的,即它的成員函數(shù)getAppToken的返回值不等于null,那么它在WindowState堆棧中的位置就是我們要找到的位置i。有了這個位置i之后,將它的值加上1,就可以得到參數(shù)t所描述的AppWindowToken對象所對應(yīng)的WindowState對象在WindowState堆棧的起始偏移位置了。

第二種情況是參數(shù)tokenPos的值小于WindowManagerService類的成員變量mAppTokens所描述的一個ArrayList的大小。根據(jù)前面得到的推論,我們只要在mAppTokens列表中找到一個AppWindowToken對象,它滿足以下三個條件:

A. 它在mAppTokens列表中的位置小于tokenPos;

B. 它在WindowState堆棧中對應(yīng)有WindowState對象;

C. 它不是將要置于WindowState堆棧的底部。

如果一個AppWindowToken對象在WindowState堆棧中對應(yīng)有WindowState對象,那么這些WindowState對象也會同時按照Z軸從小到大的順序保存它的成員變量windows所描述的一個ArrayList中,這意味著如果一個AppWindowToken對象滿足條件B,那么它的成員變量windows所描述的一個ArrayList的大小就大于0。

如果一個AppWindowToken對象不是將要置于WindowState堆棧的底部,那么它的成員變量sendingToBottom的值就不等于true,這也意味這個AppWindowToken對象滿足條件C。

如果能找到滿足上述條件的一個AppWindowToken對象wtoken,那么我們只要找到與它所對應(yīng)的Z軸位置最大的WindowState對象在WindowManagerService服務(wù)內(nèi)部的WindowState堆棧中的位置i,那么將它的值加1,就可以得到與參數(shù)tokenPos所描述的AppWindowToken對象所對應(yīng)的WindowState對象在WindowState堆棧的起始偏移位置了。

那么如何找到與這個AppWindowToken對象wtoken對應(yīng)的Z軸位置最大的WindowState對象在WindowManagerService服務(wù)內(nèi)部的WindowState堆棧中的位置i呢?從前面的圖1可以知道,一個AppWindowToken對象所對應(yīng)的WindowState對象可以劃分為兩種類型:第一種類型是父窗口類型的;第二種是子窗口類型的。如果一個WindowState對象所描述的窗口是父窗口,那么它的子窗口就保存在它的成員變量mChildWindows所描述的一個ArrayList中,并且這些子窗口是按照Z軸位置從小到大的順序排列的,同時,該WindowState對象也會保存在與它所對應(yīng)的一個AppWindowToken對象的成員變量windows所描述的一個ArrayList中。

有了上述結(jié)論,并且假設(shè)存在一個能夠滿足上述三個條件的AppWindowToken對象wtoken,那么就可以從上到下遍歷保存在它的成員變量windows所描述的一個ArrayList中的每一個WindowState對象win:

I. 如果WindowState對象win所描述的一個窗口具有子窗口,那么就繼續(xù)從上到下遍歷這些子窗口,即從上到下遍歷WindowState對象win的成員變量mChildWindows所描述的一個ArrayList。如果能找到一個WindowState對象cwin,它的成員變量mSubLayer的值大于等于0,那么該WindowState對象cwin在WindowManagerService服務(wù)內(nèi)部的WindowState堆棧中的位置就是我們要得到的位置i。注意,如果WindowState對象cwin的成員變量mSubLayer的值小于0,那么它雖然是一個子窗口,但是它卻是位于父窗口的后面的,即它的Z軸位置是小于父窗口的Z軸位置的。

II. 如果WindowState對象win所描述的一個窗口不具有子窗口,即它的成員變量mChildWindows所描述的一個ArrayList的大小等于0,那么它在WindowManagerService服務(wù)內(nèi)部的WindowState堆棧中的位置就是我們要得到的位置i。

得到了位置i之后,將它的值加1,那么就可以得到與參數(shù)tokenPos所描述的AppWindowToken對象所對應(yīng)的WindowState對象在WindowState堆棧的起始偏移位置了。

回到WindowManagerService類的成員函數(shù)moveAppToken中,調(diào)整好參數(shù)token所描述的AppWindowToken對象所對應(yīng)的WindowState對象在WindowState堆棧中的位置之后,即調(diào)用了成員函數(shù)reAddAppWindowsLocked之后,這時候系統(tǒng)中的窗口的布局就會發(fā)生了變化,即系統(tǒng)中的窗口的Z軸位置關(guān)系發(fā)生了變化,那么接下來就需要調(diào)用成員函數(shù)updateFocusedWindowLocked來重新計算系統(tǒng)中的窗口的Z軸位置,并且調(diào)用成員函數(shù)performLayoutAndPlaceSurfacesLocked來重新布局系統(tǒng)中的窗口。

4. 移動AppWindowToken至頂端

移動AppWindowToken至頂端是通過調(diào)用WindowManagerService類的成員函數(shù)moveAppTokensToTop來實現(xiàn)的,如下所示:

復(fù)制代碼 代碼如下:

public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor {
......

public void moveAppTokensToTop(List<IBinder> tokens) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"moveAppTokensToTop()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}

final long origId = Binder.clearCallingIdentity();
synchronized(mWindowMap) {
removeAppTokensLocked(tokens);
final int N = tokens.size();
for (int i=0; i<N; i++) {
AppWindowToken wt = findAppWindowToken(tokens.get(i));
if (wt != null) {
mAppTokens.add(wt);
if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
mToTopApps.remove(wt);
mToBottomApps.remove(wt);
mToTopApps.add(wt);
wt.sendingToBottom = false;
wt.sendingToTop = true;
}
}
}

if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) {
moveAppWindowsLocked(tokens, mAppTokens.size());
}
}
Binder.restoreCallingIdentity(origId);
}

......
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

WindowManagerService類的成員函數(shù)moveAppTokensToTop可以同時將一組AppWindowToken移至頂端,同時需要調(diào)用者具有android.Manifest.permission.MANAGE_APP_TOKENS權(quán)限。

參數(shù)tokens所描述的是一個IBinder接口列表,與這些IBinder接口所對應(yīng)的AppWindowToken對象就是接下來要移至頂端的。在將保存在參數(shù)tokens中的IBinder接口所對應(yīng)的AppWindowToken對象移至頂端之前,WindowManagerService類的成員函數(shù)首先會調(diào)用前面所描述的成員函數(shù)removeAppTokensLocked來刪除這些AppWindowToken對象,然后再依次將它們添加到WindowManagerService類的成員變量mAppTokens所描述的一個ArrayList的末尾去。

注意,WindowManagerService類的成員變量mNextAppTransition用來描述系統(tǒng)當(dāng)前是否正在切換Activity窗口。如果是的話,那么它的值就不等于WindowManagerPolicy.TRANSIT_UNSET,這時候就需要:

A. 將所有要移至頂端的AppWindowToken對象都保存在WindowManagerService類的另外一個成員變量mToTopApps所描述的一個ArrayList中去,并且將這些AppWindowToken對象的成員變量sendingToTop的值設(shè)置為true。

B. 將所有要移至頂端的AppWindowToken對象所對應(yīng)WindowState對象都移至WindowManagerService服務(wù)內(nèi)部的一個WindowState堆棧的頂端去,這是通過調(diào)用另外一個成員函數(shù)moveAppWindowsLocked來實現(xiàn)的。

執(zhí)行完成上述兩個操作之后,與要移至頂端的AppWindowToken對象所對應(yīng)的窗口就會位于窗口堆棧的最上面了。

5. 移動AppWindowToken至底端

移動AppWindowToken至頂端是通過調(diào)用WindowManagerService類的成員函數(shù)moveAppTokensToBottom來實現(xiàn)的,如下所示:

復(fù)制代碼 代碼如下:

public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor {
......

public void moveAppTokensToBottom(List<IBinder> tokens) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"moveAppTokensToBottom()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}

final long origId = Binder.clearCallingIdentity();
synchronized(mWindowMap) {
removeAppTokensLocked(tokens);
final int N = tokens.size();
int pos = 0;
for (int i=0; i<N; i++) {
AppWindowToken wt = findAppWindowToken(tokens.get(i));
if (wt != null) {
mAppTokens.add(pos, wt);
if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
mToTopApps.remove(wt);
mToBottomApps.remove(wt);
mToBottomApps.add(i, wt);
wt.sendingToTop = false;
wt.sendingToBottom = true;
}
pos++;
}
}

if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) {
moveAppWindowsLocked(tokens, 0);
}
}
Binder.restoreCallingIdentity(origId);
}

......
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

WindowManagerService類的成員函數(shù)moveAppTokensToBottom可以同時將一組AppWindowToken移至底端。將一組AppWindowToken移至底端與將一組AppWindowToken移至頂端的實現(xiàn)是類似的,只不過是移動的方向相反而已。因此,WindowManagerService類的成員函數(shù)moveAppTokensToBottom的實現(xiàn)可以參考前面所分析的成員函數(shù)moveAppTokensToTop的實現(xiàn),這里不再詳述。

6. 增加WindowToken

從圖1可以知道,如果一個WindowState對象不是與一個AppWindowToken對象對應(yīng)的,那么它就必須要與一個WindowToken對象對應(yīng)。例如,用來描述輸入法窗口和壁紙窗口的WindowState對象對應(yīng)的就是WindowToken對象,而不是AppWindowToken對象,因為它們不是Activity類型的窗口。

輸入法窗口和壁紙窗口分別是由輸入法管理服務(wù)InputMethodManagerService和壁紙管理服務(wù)WallpaperManagerService調(diào)用WindowManagerService類的成員函數(shù)addWindowToken來增加對應(yīng)的WindowToken對象的,如下所示:

復(fù)制代碼 代碼如下:

public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor {
......

public void addWindowToken(IBinder token, int type) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"addWindowToken()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}

synchronized(mWindowMap) {
WindowToken wtoken = mTokenMap.get(token);
if (wtoken != null) {
Slog.w(TAG, "Attempted to add existing input method token: " + token);
return;
}
wtoken = new WindowToken(token, type, true);
mTokenMap.put(token, wtoken);
mTokenList.add(wtoken);
if (type == TYPE_WALLPAPER) {
mWallpaperTokens.add(wtoken);
}
}
}

......
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

調(diào)用WindowManagerService類的成員函數(shù)addWindowToken需要具有android.Manifest.permission.MANAGE_APP_TOKENS權(quán)限。

對于輸入法窗口和壁紙窗口來說,參數(shù)token指向的是與它們所關(guān)聯(lián)的一個Binder對象的IBinder接口,而參數(shù)type描述的是要在WindowManagerService服務(wù)內(nèi)部增加WindowToken對象的窗口的類型。

WindowManagerService類的成員函數(shù)addWindowToken首先檢查在成員變量mTokenMap所描述的一個HashMap檢查是否已經(jīng)存在一個WindowToken對象與參數(shù)token對應(yīng)。如果已經(jīng)存在的話,那么WindowManagerService類的成員函數(shù)addWindowToken就什么也不做就返回了,否則的話,就會使用參數(shù)token來創(chuàng)建一個WindowToken對象,并且會將該WindowToken對象分別保存在WindowManagerService類的成員變量mTokenMap和mTokenList中。

這里有兩個地方需要注意:

A. 由于這里增加的是WindowToken對象,而不是AppWindowToken對象,因此,與增加AppWindowToken不同,這里不需要將新創(chuàng)建的WindowToken對象保存在WindowManagerService類的成員變量mAppTokens中。

B. 如果參數(shù)type的值等于TYPE_WALLPAPER,那么就意味著新創(chuàng)建的WindowToken對象是用來描述壁紙窗口的,這時候還需要將新創(chuàng)建的WindowToken對象保存在WindowManagerService類的成員變量mWallpaperTokens所描述的一個ArrayList中,以方便管理壁紙窗口。

對于非輸入法窗口、非壁紙窗口以及非Activity窗口來說,它們所對應(yīng)的WindowToken對象是在它們增加到WindowManagerService服務(wù)的時候創(chuàng)建的。從前面Android應(yīng)用程序窗口(Activity)與WindowManagerService服務(wù)的連接過程分析一文可以知道,增加一個窗口WindowManagerService服務(wù)最終是通過調(diào)用WindowManagerService類的成員函數(shù)addWindow來實現(xiàn)的,接下來我們就主要分析與創(chuàng)建WindowToken相關(guān)的邏輯,如下所示:

復(fù)制代碼 代碼如下:

public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor {
......

public int addWindow(Session session, IWindow client,
WindowManager.LayoutParams attrs, int viewVisibility,
Rect outContentInsets, InputChannel outInputChannel) {
......

synchronized(mWindowMap) {
......

boolean addToken = false;
WindowToken token = mTokenMap.get(attrs.token);
if (token == null) {
if (attrs.type >= FIRST_APPLICATION_WINDOW
&& attrs.type <= LAST_APPLICATION_WINDOW) {
......
return WindowManagerImpl.ADD_BAD_APP_TOKEN;
}
if (attrs.type == TYPE_INPUT_METHOD) {
......
return WindowManagerImpl.ADD_BAD_APP_TOKEN;
}
if (attrs.type == TYPE_WALLPAPER) {
......
return WindowManagerImpl.ADD_BAD_APP_TOKEN;
}
token = new WindowToken(attrs.token, -1, false);
addToken = true;
}

......

if (addToken) {
mTokenMap.put(attrs.token, token);
mTokenList.add(token);
}

......
}

......
}

......
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

如果參數(shù)attrs所描述的一個WindowManager.LayoutParams對象的成員變量token所指向的一個IBinder接口在WindowManagerService類的成員變量mTokenMap所描述的一個HashMap中沒有一個對應(yīng)的WindowToken對象,并且該WindowManager.LayoutParams對象的成員變量type的值不等于TYPE_INPUT_METHOD、TYPE_WALLPAPER,以及不在FIRST_APPLICATION_WINDOW和LAST_APPLICATION_WINDOW,那么就意味著這時候要增加的窗口就既不是輸入法窗口,也不是壁紙窗口和Activity窗口,因此,就需要以參數(shù)attrs所描述的一個WindowManager.LayoutParams對象的成員變量token所指向的一個IBinder接口為參數(shù)來創(chuàng)建一個WindowToken對象,并且將該WindowToken對象保存在WindowManagerService類的成員變量mTokenMap和mTokenList中。

7. 刪除WindowToken

刪除WindowToken是通過調(diào)用WindowManagerService類的成員函數(shù)removeWindowToken來實現(xiàn)的,如下所示:

復(fù)制代碼 代碼如下:

public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor {
......

public void removeWindowToken(IBinder token) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"removeWindowToken()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}

final long origId = Binder.clearCallingIdentity();
synchronized(mWindowMap) {
WindowToken wtoken = mTokenMap.remove(token);
mTokenList.remove(wtoken);
if (wtoken != null) {
boolean delayed = false;
if (!wtoken.hidden) {
wtoken.hidden = true;

final int N = wtoken.windows.size();
boolean changed = false;

for (int i=0; i<N; i++) {
WindowState win = wtoken.windows.get(i);

if (win.isAnimating()) {
delayed = true;
}

if (win.isVisibleNow()) {
applyAnimationLocked(win,
WindowManagerPolicy.TRANSIT_EXIT, false);
changed = true;
}
}

if (changed) {
mLayoutNeeded = true;
performLayoutAndPlaceSurfacesLocked();
updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL);
}

if (delayed) {
mExitingTokens.add(wtoken);
} else if (wtoken.windowType == TYPE_WALLPAPER) {
mWallpaperTokens.remove(wtoken);
}
}

......
} else {
Slog.w(TAG, "Attempted to remove non-existing token: " + token);
}
}
Binder.restoreCallingIdentity(origId);
}

......
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

調(diào)用WindowManagerService類的成員函數(shù)removeWindowToken需要具有android.Manifest.permission.MANAGE_APP_TOKENS權(quán)限。

WindowManagerService類的成員函數(shù)removeWindowToken首先找到與參數(shù)token所描述的Binder接口所對應(yīng)的WindowToken對象,接著再將該WindowToken對象從WindowManagerService類的成員變量mTokenMap和mTokenList中刪除。

刪除了一個WindowToken對象之后,如果該WindowToken對象不是處于不可見的狀態(tài),即它的成員變量hidden的值不等于false,那么就意味著它所描述窗口口也有可能是可見的,那么WindowManagerService類的成員函數(shù)removeWindowToken就需要作以下兩個檢查:

A. 如果該WindowToken對象所描述的窗口的其中一個處于動畫顯示過程,即用來描述該窗口的一個WindowState對象的成員函數(shù)isAnimating的返回值等于true,那么就需要該WindowToken對象的狀態(tài)設(shè)置為正在退出狀態(tài),即將它保存在WindowManagerService類的成員變量mExitingTokens所描述的一個ArrayList中。

B. 如果該WindowToken對象所描述的窗口是可見的,即用來描述該窗口的一個WindowState對象的成員函數(shù)isVisibleNow的返回值等于true,那么就需要調(diào)用WindowManagerService類的成員函數(shù)applyAnimationLocked來給它應(yīng)用一個退出動畫,該退出動畫是通過調(diào)用WindowManagerService類的成員函數(shù)performLayoutAndPlaceSurfacesLocked來實現(xiàn)的。當(dāng)一個窗口退出了之后,系統(tǒng)當(dāng)前獲得焦點(diǎn)的窗口可能會發(fā)生變化,這時候就需要調(diào)用WindowManagerService類的成員函數(shù)updateFocusedWindowLocked來重新調(diào)整系統(tǒng)當(dāng)前獲得焦點(diǎn)的窗口。

注意,如果正在刪除的WindowToken對象是用來描述壁紙窗口的,那么還需要將該WindowToken對象從WindowManagerService類的成員變量mWallpaperTokens所描述的一個ArrayList中刪除。

8. 增加WindowState

從前面Android應(yīng)用程序窗口(Activity)與WindowManagerService服務(wù)的連接過程分析一文可以知道,增加一個窗口WindowManagerService服務(wù)最終是通過調(diào)用WindowManagerService類的成員函數(shù)addWindow來實現(xiàn)的,如下所示:

復(fù)制代碼 代碼如下:

public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor {
......

/**
* Mapping from an IWindow IBinder to the server's Window object.
* This is also used as the lock for all of our state.
*/
final HashMap<IBinder, WindowState> mWindowMap = new HashMap<IBinder, WindowState>();
......

/**
* Z-ordered (bottom-most first) list of all Window objects.
*/
final ArrayList<WindowState> mWindows = new ArrayList<WindowState>();
......

public int addWindow(Session session, IWindow client,
WindowManager.LayoutParams attrs, int viewVisibility,
Rect outContentInsets, InputChannel outInputChannel) {
......

WindowState win = null;

synchronized(mWindowMap) {
......

win = new WindowState(session, client, token,
attachedWindow, attrs, viewVisibility);
......

mWindowMap.put(client.asBinder(), win);
......

if (attrs.type == TYPE_INPUT_METHOD) {
mInputMethodWindow = win;
addInputMethodWindowToListLocked(win);
......
} else if (attrs.type == TYPE_INPUT_METHOD_DIALOG) {
mInputMethodDialogs.add(win);
addWindowToListInOrderLocked(win, true);
adjustInputMethodDialogsLocked();
......
} else {
addWindowToListInOrderLocked(win, true);
if (attrs.type == TYPE_WALLPAPER) {
.......
adjustWallpaperWindowsLocked();
} else if ((attrs.flags&FLAG_SHOW_WALLPAPER) != 0) {
adjustWallpaperWindowsLocked();
}
}

......
}

......
}

......
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

WindowManagerService類有兩個成員變量mWindowMap和mWindows是用來保存系統(tǒng)中的WindowState對象。其中,成員變量mWindowMap指向的是一個HashMap,它的關(guān)鍵字是一個IBinder接口,一般這個IBinder接口指向的是一個Binder代理對象,引用了運(yùn)行在應(yīng)用程序進(jìn)程這一側(cè)的一個類型為W的Binder本地對象,用來描述一個窗口;成員變量mWindows指向的是一個ArrayList,保存在它里面的WindowState對象是按照其Z軸位置從小到大的順序排列的。成員變量mWindowMap和mWindows的區(qū)別在于,前者給在定一個IBinder接口的情況下,可以快速找到與對應(yīng)的WindowState對象,而后者用來從上到下或者下到上遍歷系統(tǒng)的WindowState對象。由于系統(tǒng)中的WindowState對象是按照其Z軸位置從小到大的順序排列在成員變量mWindows中的,因此,成員變量mWindows所指向的ArrayList就是我們在前面圖1中所說的Window Stack。

理解了WindowManagerService類有兩個成員變量mWindowMap和mWindows的作用之后,WindowManagerService類的成員函數(shù)addWindow增加一個WindowState對象的過程就容易理解了。

參數(shù)client是一個Binder代理對象,引用了運(yùn)行在應(yīng)用程序進(jìn)程這一側(cè)的一個類型為W的Binder本地對象,用來描述要增加到WindowManagerService服務(wù)中的一個窗口。WindowManagerService類的成員函數(shù)addWindow首先創(chuàng)建一個WindowState對象win,接著再以參數(shù)client所描述的一個Binder代理對象的IBinder接口為關(guān)鍵字,將WindowState對象win保存在WindowManagerService類的成員變量mWindowMap中,最后還會根據(jù)要增加到WindowManagerService服務(wù)中的窗口的類型來調(diào)用不同的成員函數(shù)將WindowState對象win增加到WindowManagerService類的成員變量mWindows中:

A. 如果要增加的是輸入法窗口,即參數(shù)attrs所描述的一個WindowManager.LayoutParams對象的成員變量type的值等于TYPE_INPUT_METHOD,那么就會調(diào)用成員函數(shù)addInputMethodWindowToListLocked來將WindowState對象win增加到WindowManagerService類的成員變量mWindows中去,并且會將WindowState對象win保存在WindowManagerService類的成員變量mInputMethodWindow中。

B. 如果要增加的是輸入法對話框,即參數(shù)attrs所描述的一個WindowManager.LayoutParams對象的成員變量type的值等于TYPE_INPUT_METHOD_DIALOG,那么就會調(diào)用成員函數(shù)addWindowToListInOrderLocked來將WindowState對象win增加到WindowManagerService類的成員變量mWindows中去,并且會將WindowState對象win保存在WindowManagerService類的成員變量mInputMethodDialogs中,以及調(diào)用成員函數(shù)adjustInputMethodDialogsLocked來調(diào)整剛才所添加的輸入法窗口在窗口堆棧中的位置,使得它位于系統(tǒng)當(dāng)前需要輸入法窗口的窗口的上面。

C.  如果要增加的是壁紙窗口,即參數(shù)attrs所描述的一個WindowManager.LayoutParams對象的成員變量type的值等于TYPE_WALLPAPER,那么就會調(diào)用成員函數(shù)addWindowToListInOrderLocked來將WindowState對象win增加到WindowManagerService類的成員變量mWindows中去,并且會調(diào)用成員函數(shù)adjustWallpaperWindowsLocked來調(diào)整剛才所添加的壁紙窗口在窗口堆棧中的位置,使得它位于系統(tǒng)當(dāng)前需要壁紙窗口的窗口的下面。

D . 如果要增加的既不是輸入法窗口,也不是輸入法對話框和壁紙窗口,那么就只會調(diào)用成員函數(shù)addWindowToListInOrderLocked來將WindowState對象win增加到WindowManagerService類的成員變量mWindows中去,但是如果要增加的窗口需要顯示壁紙,即參數(shù)attrs所描述的一個WindowManager.LayoutParams對象的成員變量flags的FLAG_SHOW_WALLPAPER位等于1,那么還會繼續(xù)調(diào)用成員函數(shù)adjustWallpaperWindowsLocked來調(diào)整系統(tǒng)中的壁紙窗口在窗口堆棧中的位置,使得它位于剛才所添加的窗口的下面。

在后面的兩篇文章中,我們再詳細(xì)分析WindowManagerService類的成員函數(shù)addInputMethodWindowToListLocked、adjustInputMethodDialogsLocked和adjustWallpaperWindowsLocked的實現(xiàn),其中,前兩者是與輸入法窗口相關(guān)的,而后者是與壁紙窗口相關(guān)的。本文主要關(guān)注WindowManagerService類的成員函數(shù)addWindowToListInOrderLocked的實現(xiàn),它會將一個指定的WindowState對象增加到窗口堆棧中的合適位置上去。

9. 增加WindowState到窗口堆棧

從前面的分析可以知道,將一個WindowState對象增加到WindowManagerService服務(wù)內(nèi)部中的窗口堆棧,即WindowManagerService類的成員變量mWindows,是通過調(diào)用WindowManagerService類的成員函數(shù)addWindowToListInOrderLocked來實現(xiàn)的。

WindowManagerService類的成員函數(shù)addWindowToListInOrderLocked的實現(xiàn)比較復(fù)雜,我們先列出它的框架,然后再詳細(xì)分析它的實現(xiàn),如下所示:

復(fù)制代碼 代碼如下:

public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor {
......

private void addWindowToListInOrderLocked(WindowState win, boolean addToToken) {
final IWindow client = win.mClient;
final WindowToken token = win.mToken;
final ArrayList<WindowState> localmWindows = mWindows;

final int N = localmWindows.size();
final WindowState attached = win.mAttachedWindow;
int i;
if (attached == null) {
//CASE 1:要增加的窗口win沒有附加在其它窗口上
int tokenWindowsPos = token.windows.size();
if (token.appWindowToken != null) {
//CASE 1.1:要增加的窗口win是一個Activity窗口
int index = tokenWindowsPos-1;
if (index >= 0) {
//CASE 1.1.1:用來要增加的窗口win的令牌token已存在其它窗口
......
} else {
//CASE 1.1.2:用來要增加的窗口win的令牌token尚未存在任何窗口
......
}
} else {
//CASE 1.2:要增加的窗口win不是一個Activity窗口
......
}
if (addToToken) {
token.windows.add(tokenWindowsPos, win);
}
} else {
//CASE 2:要增加的窗口win附加在窗口attached上
......
}

if (win.mAppToken != null && addToToken) {
win.mAppToken.allAppWindows.add(win);
}
}

......
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

我們首先分析一下WindowManagerService類的成員函數(shù)addWindowToListInOrderLocked的幾個本地變量的含義:

A. token。本地變量token指向的是參數(shù)win所描述的一個WindowState對象的成員變量mToken所指向一個WindowToken對象,這個WindowToken對象用來描述WindowState對象win所對應(yīng)的窗口令牌。

B. localmWindows。本地變量localmWindows指向的是WindowManagerService類的成員變量mWindows所描述的一個ArrayList,即一個窗口堆棧,WindowManagerService類的成員函數(shù)addWindowToListInOrderLocked的目標(biāo)就是要將參數(shù)win所描述的一個WindowState對象增加到該窗口堆棧的合適位置上去。

C. attached。本地變量attached指向的是參數(shù)win所描述的一個WindowState對象的成員變量mAttachedWindow 所指向的一個WindowState對象,如果它的值不等于null,那么就意味參數(shù)win所描述的窗口要附加在本地變量attached所描述的窗口上。

D. tokenWindowsPos。本地變量tokenWindowsPos用來描述與窗口令牌token所對應(yīng)的窗口的數(shù)量。

E. token.appWindowToken。從前面Android應(yīng)用程序窗口(Activity)與WindowManagerService服務(wù)的連接過程分析一文可以知道,如果一個WindowToken對象的成員變量appWindowToken的值不等于null,那么就意味著該WindowToken對象的實際類型為是AppWindowToken,即它所描述的是一個Activity窗口令牌,這種類型的令牌的特點(diǎn)是在ActivityManagerService服務(wù)的Activity組件堆棧中對應(yīng)有一個ActivityRecord對象,如圖1所示。

F. index。本地變量index的值等于tokenWindowsPos-1,如果它的值大于等于0,那么就意味著窗口令牌tokent已經(jīng)存在其它窗口,否則的話,就意味著窗口令牌tokent尚未存在任何窗口。

從這些本地變量的含義,我們就可以分情況來將參數(shù)win所描述的一個WindowState對象增加到WindowManagerService服務(wù)內(nèi)部的窗口堆棧的合適位置上去:

CASE 1:要增加的窗口win沒有附加在其它窗口上

----CASE 1.1:要增加的窗口win是一個Activity窗口

   ----CASE 1.1.1:用來要增加的窗口win的令牌token已存在其它窗口。這時候意味著窗口win需要保存在其它已經(jīng)存在的窗口的附近,因此,我們只要找到這些已經(jīng)存在的窗口在窗口堆棧中的位置,那么再根據(jù)其它屬性,就可以將窗口win保存在已經(jīng)存在的窗口的上面或者下面。

   ----CASE 1.1.2:用來要增加的窗口win的令牌token尚未存在任何窗口。雖然這時候窗口win在窗口堆棧中沒有位置可以參考,但是它畢竟是一個Activity窗口,我們可以通過與它所對應(yīng)的AppWindowToken對象在App Token List(即WindowManagerService類的成員變量mAppTokens所描述的一個ArrayList)中的位置來獲得它窗口堆棧中的位置?;貞浳覀冊谇懊娴?節(jié)分析移動AppWindowToken至指定位置的操作時得到的結(jié)論:WindowManagerService服務(wù)內(nèi)部中的所有WindowState對象都是按照Z軸從位置從小到大排列在WindowState堆棧中的,并且在mAppTokens列表中,位于上面的一個AppWindowToken對象所對應(yīng)的那些WindowState對象的Z軸位置是一定大于位于下面的一個AppWindowToken對象所對應(yīng)的那些WindowState對象的Z軸位置的。因此,我們只要找到用來描述窗口win的一個AppWindowToken對象(token.appWindowToken)的上一個或者下一個AppWindowToken對象所對應(yīng)的窗口在窗口堆棧中的位置,那么就可以這個位置為參考,得到窗口win在窗口堆棧中的位置。

----CASE 1.2:要增加的窗口win不是一個Activity窗口。這時候既然要增加的窗口也沒有附加在其它窗口上,那么就意味著要增加的窗口win在窗口堆棧中沒有位置可以參考,因此,我們就需要根據(jù)它的Z軸位置來決定它在窗口堆棧的位置。

CASE 2:要增加的窗口win附加在窗口attached上。這時候就意味著要增加的窗口win要保存在窗口attached的上面,即窗口在窗口堆棧的位置要以窗口attached在窗口堆棧的位置為參考。

從上面的分析就可以知道,CASE 1.1.1、CASE 1.1.2CASE 2都有一個共同特點(diǎn),即要增加的窗口win在窗口堆棧的位置有一個參考值,而在CASE 1.2中,要增加的窗口win在窗口堆棧的位置沒有參考值,需要通過其Z軸位置來確定。

在分析上述四種情況之前, 我們還需要再說明一下WindowManagerService類的成員函數(shù)addWindowToListInOrderLocked的參數(shù)addToToken的含義。參數(shù)addToToken是一個布爾變量,如果它的值等于true,那么就說明需要將參數(shù)win所描述的一個WindowState對象添加用來描述它的窗口令牌token的成員變量windows所描述的一個ArrayList中去。注意,窗口令牌token的成員變量windows所描述的一個ArrayList里面所保存的WindowState對象是按照Z軸位置從小到大的順序來排列的,因此,在將WindowState對象win保存到這個ArrayList之前,首先要按照它的Z軸位置計算得到它在這個ArrayList中的位置tokenWindowsPos。另一方面,在參數(shù)addToToken的值等于true,并且參數(shù)win所描述的是一個Activity窗口,即它的成員變量mAppToken不等于null的情況下,還需要將參數(shù)win所描述的一個WindowState對象保存在用來描述它的窗口令牌,即一個AppWindowToken對象成員變量allAppWindows所描述的一個ArrayList中去,以便可以知道一個AppWindowToken對象對應(yīng)的Activity窗口都有哪些。

接下來,我們就分別分析這四種情況是如何將窗口win增加窗口堆棧中去的。

CASE 1.1.1對應(yīng)的代碼為:

復(fù)制代碼 代碼如下:

if (win.mAttrs.type == TYPE_BASE_APPLICATION) {
// Base windows go behind everything else.
placeWindowBefore(token.windows.get(0), win);
tokenWindowsPos = 0;
} else {
AppWindowToken atoken = win.mAppToken;
if (atoken != null &&
token.windows.get(index) == atoken.startingWindow) {
placeWindowBefore(token.windows.get(index), win);
tokenWindowsPos--;
} else {
int newIdx = findIdxBasedOnAppTokens(win);
if(newIdx != -1) {
//there is a window above this one associated with the same
//apptoken note that the window could be a floating window
//that was created later or a window at the top of the list of
//windows associated with this token.
......
localmWindows.add(newIdx+1, win);
mWindowsChanged = true;
}
}
}

這段代碼又分為三種情況來將參數(shù)win所描述的一個WindowState對象添加到窗口堆棧中:

A. 參數(shù)win描述的窗口的類型為TYPE_BASE_APPLICATION。在一個令牌對應(yīng)的所有窗口中,類型為TYPE_BASE_APPLICATION的窗口位于其它類型的窗口的下面。因此,這段代碼就會調(diào)用WindowManagerService類的成員函數(shù)placeWindowBefore來將參數(shù)win所描述的一個WindowState對象保存窗口堆棧中,并且它是位于令牌token的窗口列表的第0個位置的WindowState對象的下面。這時候變量tokenWindowsPos的值會被設(shè)置為0,表示參數(shù)win所描述的一個WindowState對象要保存窗口令牌token的窗口列表的第0個位置上。

B. 參數(shù)win描述的一個WindowState對象的成員變量mAppToken的值不等于null,這意味著參數(shù)win描述的是一個Activity窗口,這時候如果窗口令牌atoken(與token描述的是同一個窗口令牌)的窗口列表的第index個位置(即最上面的一個位置) 的WindowState對象描述的是一個Activity啟動窗口,即與窗口令牌atoken的成員變量startingWindow描述的是同一個窗口,那么就說明窗口令牌atoken的窗口列表的第index個位置的WindowState對象描述的是窗口win的啟動窗口。由于一個窗口的啟動窗口總是位于它的上面,因此,這段代碼就會調(diào)用WindowManagerService類的成員函數(shù)placeWindowBefore來將參數(shù)win所描述的一個WindowState對象保存窗口堆棧中,并且它是位于令牌atoken的窗口列表的第index個位置的WindowState對象的下面。這時候變量tokenWindowsPos的值減少1,即相當(dāng)于是等于index,表示參數(shù)win所描述的一個WindowState對象要插入在窗口令牌token的窗口列表的第index個位置上。

C. 參數(shù)win所描述的窗口的類型既不是TYPE_BASE_APPLICATION,而且它也沒有啟動窗口,那么這時候就需要將它保存在窗口令牌token的窗口列表的最上面一個窗口的上面。窗口令牌token的窗口列表的最上面一個窗口在窗口堆棧中的位置newIdx是通過調(diào)用WindowManagerService類的成員函數(shù)findIdxBaseOnAppTokens來獲得的,這時候參數(shù)win所描述的一個WindowState對象就應(yīng)該保存在窗口堆棧,即變量localmWindows所描述的一個ArrayList的第newIdx+1個位置上。

CASE 1.1.2對應(yīng)的代碼為:

復(fù)制代碼 代碼如下:

// Figure out where the window should go, based on the
// order of applications.
final int NA = mAppTokens.size();
WindowState pos = null;
for (i=NA-1; i>=0; i--) {
AppWindowToken t = mAppTokens.get(i);
if (t == token) {
i--;
break;
}

// We haven't reached the token yet; if this token
// is not going to the bottom and has windows, we can
// use it as an anchor for when we do reach the token.
if (!t.sendingToBottom && t.windows.size() > 0) {
pos = t.windows.get(0);
}
}
// We now know the index into the apps. If we found
// an app window above, that gives us the position; else
// we need to look some more.
if (pos != null) {
// Move behind any windows attached to this one.
WindowToken atoken = mTokenMap.get(pos.mClient.asBinder());
if (atoken != null) {
final int NC = atoken.windows.size();
if (NC > 0) {
WindowState bottom = atoken.windows.get(0);
if (bottom.mSubLayer < 0) {
pos = bottom;
}
}
}
placeWindowBefore(pos, win);
} else {
// Continue looking down until we find the first
// token that has windows.
while (i >= 0) {
AppWindowToken t = mAppTokens.get(i);
final int NW = t.windows.size();
if (NW > 0) {
pos = t.windows.get(NW-1);
break;
}
i--;
}
if (pos != null) {
// Move in front of any windows attached to this
// one.
WindowToken atoken = mTokenMap.get(pos.mClient.asBinder());
if (atoken != null) {
final int NC = atoken.windows.size();
if (NC > 0) {
WindowState top = atoken.windows.get(NC-1);
if (top.mSubLayer >= 0) {
pos = top;
}
}
}
placeWindowAfter(pos, win);
placeWindowAfter(pos, win);
} else {
// Just search for the start of this layer.
final int myLayer = win.mBaseLayer;
for (i=0; i<N; i++) {
WindowState w = localmWindows.get(i);
if (w.mBaseLayer > myLayer) {
break;
}
}
......
localmWindows.add(i, win);
mWindowsChanged = true;
}
}

這段代碼要能冠軍WindowManagerService服務(wù)內(nèi)部的一個AppWindowToken列表mAppTokens來在窗口堆棧中找到一個參數(shù)位置來保存參數(shù)win所描述的一個WindowState對象。

最上面的一個for循環(huán)執(zhí)行完成之后,我們假設(shè)變量pos的值不等于null,這時候它與變量i以及變量token的關(guān)系如圖2所示:


圖2 窗口win位于窗口C的下面

這時候位于令牌token上面的令牌在窗口堆棧中對應(yīng)有WindowState對象。注意,這時候第i+2個令牌在窗口堆棧中不對應(yīng)有WindowState對象,而第i+3個令牌在窗口堆棧中對應(yīng)有C和D兩個WindowState對象,并且這兩個WindowState對象所描述的窗口都不是即將要切換到窗口堆棧的底部的。由于第i+3個令牌位于令牌token的上面,并且這兩個令牌之間的其它令牌在窗口堆棧中不對應(yīng)有WindowState對象,因此,這時候參數(shù)win所描述的WindowState對象在窗口堆棧中的位置應(yīng)該以第i+3個令牌所對應(yīng)的Z軸位置最小的WindowState對象在窗口堆棧中的位置為參考,即以WindowState對象C在窗口堆棧中的位置為參考,而WindowState對象C也正好是變量pos所指向的WindowState對象。

接下來,上述代碼會繼續(xù)檢查WindowState對象C是否附加有SubLayer值小于0的窗口。如果有的話,那么就會將變量pos指向SubLayer值最小的那個WindowState對象,這是因為該WindowState對象是在WindowState對象C的最下面的,并且它與WindowState對象C是同屬一個令牌的。最后,上述代碼就會調(diào)用WindowManagerService類的成員函數(shù)placeWindowBefore來將參數(shù)win所描述的一個WindowState對象保存窗口堆棧中由變量pos所指向的那個WindowState對象的下面。

假設(shè)最上面的一個for循環(huán)執(zhí)行完成之后,變量pos的值等于null,那么就說明位于令牌token上面的令牌在窗口堆棧中都沒有對應(yīng)有WindowState對象,或者說它們所對應(yīng)的WindowState對象都是即將要切換到窗口堆棧的底部去的,這時候就需要通過位于令牌token上面的令牌來在窗口堆棧中找到一個參考位置來保存參數(shù)win所描述的WindowState對象,這是通過中間的while循環(huán)來實現(xiàn)的。

中間的while循環(huán)執(zhí)行完成之后,假設(shè)變量pos的值不等于null,這時候它與變量i以及變量token的關(guān)系如圖3所示:

圖3 窗口win位于窗口D的上面

這時候位于令牌token上面的令牌在窗口堆棧中沒有對應(yīng)有WindowState對象。注意,這時候第i-1個令牌在窗口堆棧中不對應(yīng)有WindowState對象,而第i-2個令牌在窗口堆棧中對應(yīng)有C和D兩個WindowState對象。由于第i-2個令牌位于令牌token的下面,并且這兩個令牌之間的其它令牌在窗口堆棧中不對應(yīng)有WindowState對象,因此,這時候參數(shù)win所描述的WindowState對象在窗口堆棧中的位置應(yīng)該以第i-2個令牌所對應(yīng)的Z軸位置最大的WindowState對象在窗口堆棧中的位置為參考,即以WindowState對象D在窗口堆棧中的位置為參考,而WindowState對象D也正好是變量pos所指向的WindowState對象。

接下來,上述代碼會繼續(xù)檢查WindowState對象D是否附加有SubLayer值大于等于0的窗口。如果有的話,那么就會將變量pos指向SubLayer值最大的那個WindowState對象,這是因為該WindowState對象是在WindowState對象D的最上面的,并且它與WindowState對象D是同屬一個令牌的。最后,上述代碼就會調(diào)用WindowManagerService類的成員函數(shù)placeWindowAfter來將參數(shù)win所描述的一個WindowState對象保存窗口堆棧中由變量pos所指向的那個WindowState對象的上面。

假設(shè)中間的while循環(huán)執(zhí)行完成之后,變量pos的值等于null,這時候就說明在窗口堆棧中實在是找不到參考位置來保存參數(shù)win所描述的WindowState對象了,因此,就只能通過參數(shù)win所描述的WindowState對象的Z軸位置,即它的成員變量mBaseLayer的值來在窗口堆棧中找到一個合適的位置了,如最下面的for循環(huán)所示。由于窗口堆棧中的WindowState對象是按照它們的Z軸位置由小到大的順序來排列的,因此,最下面的for循環(huán)只要從下到上找到一個Z軸位置比參數(shù)win所描述的WindowState對象的Z軸位置大的一個WindowState對象在窗口堆棧中的位置i,那么就可以將參數(shù)win所描述的WindowState對象插入在窗口堆棧的第i個位置上了。

CASE 1.2對應(yīng)的代碼為:

復(fù)制代碼 代碼如下:

// Figure out where window should go, based on layer.
final int myLayer = win.mBaseLayer;
for (i=N-1; i>=0; i--) {
if (localmWindows.get(i).mBaseLayer <= myLayer) {
i++;
break;
}
}
if (i < 0) i = 0;
......
localmWindows.add(i, win);
mWindowsChanged = true;

由于這時候在窗口堆棧中是沒有參考位置來保存參數(shù)win所描述的WindowState對象的,因此,這段代碼就只能通過參數(shù)win所描述的WindowState對象的Z軸位置,即它的成員變量mBaseLayer的值來在窗口堆棧中找到一個合適的位置了,如這段代碼中的for循環(huán)所示。由于窗口堆棧中的WindowState對象是按照它們的Z軸位置由小到大的順序來排列的,因此,這段代碼中的for循環(huán)只要從上到下找到一個WindowState對象,它的Z軸位置小于或者等于參數(shù)win所描述的WindowState對象的Z軸位置,那么該WindowState對象在窗口堆棧中的位置i就可以用插入?yún)?shù)win所描述的WindowState對象了。

CASE 2對應(yīng)的代碼為:

復(fù)制代碼 代碼如下:

// Figure out this window's ordering relative to the window
// it is attached to.
final int NA = token.windows.size();
final int sublayer = win.mSubLayer;
int largestSublayer = Integer.MIN_VALUE;
WindowState windowWithLargestSublayer = null;
for (i=0; i<NA; i++) {
WindowState w = token.windows.get(i);
final int wSublayer = w.mSubLayer;
if (wSublayer >= largestSublayer) {
largestSublayer = wSublayer;
windowWithLargestSublayer = w;
}
if (sublayer < 0) {
// For negative sublayers, we go below all windows
// in the same sublayer.
if (wSublayer >= sublayer) {
if (addToToken) {
token.windows.add(i, win);
}
placeWindowBefore(
wSublayer >= 0 ? attached : w, win);
break;
}
} else {
// For positive sublayers, we go above all windows
// in the same sublayer.
if (wSublayer > sublayer) {
if (addToToken) {
token.windows.add(i, win);
}
placeWindowBefore(w, win);
break;
}
}
}
if (i >= NA) {
if (addToToken) {
token.windows.add(win);
}
if (sublayer < 0) {
placeWindowBefore(attached, win);
} else {
placeWindowAfter(largestSublayer >= 0
? windowWithLargestSublayer
: attached,
win);
}
}

這段代碼要將參數(shù)win所描述的WindowState對象附加在變量attached所描述的WindowState對象的上面或者下面,取決于它的成員變量mSubLayer的值是大于0還是小于0。我們分四種情況來考慮。

第一種情況是參數(shù)win所描述的WindowState對象的成員變量mSubLayer的值小于0,并且這時候在附加在窗口attached的WindowState對象中,存在一個WindowState對象,它的成員變量mSubLayer的值大于等于參數(shù)win所描述的WindowState對象的成員變量mSubLayer的值,如圖4和圖5所示:


圖4 窗口win插入到窗口B的下面


圖5 窗口win插入在窗口attached的下面

在圖4和圖5中,WindowState對象A和B均是附加在WindowState對象attached中。

在圖4中,WindowState對象A和B的成員變量mSubLayer的值均小于0,而WindowState對象win的成員變量mSubLayer的值比WindowState對象A的大,但是比WindowState對象B的小,這時候WindowState對象win在窗口堆棧中就應(yīng)該位于WindowState對象B的下面,這是通過調(diào)用WindowManagerService類的成員函數(shù)placeWindowBefore來實現(xiàn)的。

在圖5中,WindowState對象A和B的成員變量mSubLayer的值均大于0,由于WindowState對象win的成員變量mSubLayer的值小于0,這時候WindowState對象win在窗口堆棧中就應(yīng)該位于WindowState對象attached的下面,這是通過調(diào)用WindowManagerService類的成員函數(shù)placeWindowBefore來實現(xiàn)的。

第二種情況是參數(shù)win所描述的WindowState對象的成員變量mSubLayer的值大于0,并且這時候在附加在窗口attached的WindowState對象中,存在一個WindowState對象,它的成員變量mSubLayer的值大于參數(shù)win所描述的WindowState對象的成員變量mSubLayer的值,如圖6所示:


圖6 窗口win插入在窗口B的下面

在圖6中,WindowState對象A和B均是附加在WindowState對象attached中。其中,WindowState對象A和B的成員變量mSubLayer的值均大于0,而WindowState對象win的成員變量mSubLayer的值比WindowState對象A的大,但是比WindowState對象B的小,這時候WindowState對象win在窗口堆棧中就應(yīng)該位于WindowState對象B的下面,這是通過調(diào)用WindowManagerService類的成員函數(shù)placeWindowBefore來實現(xiàn)的。

第三種情況是參數(shù)win所描述的WindowState對象的成員變量mSubLayer的值小于0,但是在附加在窗口attached的WindowState對象中,找不到一個WindowState對象,它的成員變量mSubLayer的值比WindowState對象的成員變量mSubLayer的值大,如圖7所示:


圖7 窗口win插入在窗口attached的下面

在圖7中,WindowState對象A和B均是附加在WindowState對象attached中。其中,WindowState對象A和B以及win的成員變量mSubLayer的值均小于0,但是WindowState對象win的成員變量mSubLayer的值比WindowState對象A和B的都要大,這時候WindowState對象win在窗口堆棧中就應(yīng)該位于WindowState對象attached的下面,這是通過調(diào)用WindowManagerService類的成員函數(shù)placeWindowBefore來實現(xiàn)的。

 第四種情況是參數(shù)win所描述的WindowState對象的成員變量mSubLayer的值大于等于0,但是在附加在窗口attached的WindowState對象中,找不到一個WindowState對象,它的成員變量mSubLayer的值比WindowState對象的成員變量mSubLayer的值大,如圖8和圖9所示:


圖8 窗口win插入在窗口B的上面


圖9 窗口win插入在窗口attached的上面

 在圖8和圖9中,WindowState對象A和B均是附加在WindowState對象attached中。

在圖8中,WindowState對象A和B的成員變量mSubLayer的值均大于0,并且WindowState對象win的成員變量mSubLayer的值比WindowState對象A和B的都要大,這時候WindowState對象win在窗口堆棧中就應(yīng)該位于WindowState對象B的上面,這是通過調(diào)用WindowManagerService類的成員函數(shù)placeWindowAfter來實現(xiàn)的。

 在圖9中,WindowState對象A和B的成員變量mSubLayer的值均小于等于0,而WindowState對象win的成員變量mSubLayer的值大于0,這時候WindowState對象win在窗口堆棧中就應(yīng)該位于WindowState對象attached的上面,這是通過調(diào)用WindowManagerService類的成員函數(shù)placeWindowAfter來實現(xiàn)的。

 注意,在這四種情況中,如果參數(shù)addToToken的值等于true,那么都需要將參數(shù)win所描述的WindowState對象增加到與它所對應(yīng)的窗口令牌token的窗口列表windows中去。

 10. 刪除WindowState

  刪除WindowState是通過調(diào)用WindowManagerService類的成員函數(shù)tmpRemoveWindowLocked來實現(xiàn)的,如下所示:

復(fù)制代碼 代碼如下:

public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor {
......

private int tmpRemoveWindowLocked(int interestingPos, WindowState win) {
int wpos = mWindows.indexOf(win);
if (wpos >= 0) {
if (wpos < interestingPos) interestingPos--;
......
mWindows.remove(wpos);
mWindowsChanged = true;
int NC = win.mChildWindows.size();
while (NC > 0) {
NC--;
WindowState cw = win.mChildWindows.get(NC);
int cpos = mWindows.indexOf(cw);
if (cpos >= 0) {
if (cpos < interestingPos) interestingPos--;
......
mWindows.remove(cpos);
}
}
}
return interestingPos;
}

......
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

WindowManagerService類的成員函數(shù)tmpRemoveWindowLocked將參數(shù)win所描述的窗口及其子窗口從WindowManagerService服務(wù)內(nèi)部的窗口堆棧中刪除,即從 WindowManagerService類的成員變量mWindows所描述的一個ArrayList中刪除。

如果每一個被刪除的窗口在窗口堆棧中的位置比參數(shù)interestingPos的值小,那么WindowManagerService類的成員函數(shù)tmpRemoveWindowLocked還會將參數(shù)interestingPos的值減少1,這相當(dāng)于是計算當(dāng)刪除參數(shù)win所描述的窗口及其子窗口之后,原來位于窗口堆棧中第interestingPos個位置的窗口現(xiàn)在位于窗口堆棧的位置,這個位置最終會作為WindowManagerService類的成員函數(shù)tmpRemoveWindowLocked的返回值。

11. 在指定位置增加WindowState

在指定位置增加WindowState是通過調(diào)用WindowManagerService類的成員函數(shù)reAddWindowLocked來實現(xiàn)的,如下所示:

復(fù)制代碼 代碼如下:

public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor {
......

private final int reAddWindowLocked(int index, WindowState win) {
final int NCW = win.mChildWindows.size();
boolean added = false;
for (int j=0; j<NCW; j++) {
WindowState cwin = win.mChildWindows.get(j);
if (!added && cwin.mSubLayer >= 0) {
......
mWindows.add(index, win);
index++;
added = true;
}
......
mWindows.add(index, cwin);
index++;
}
if (!added) {
......
mWindows.add(index, win);
index++;
}
mWindowsChanged = true;
return index;
}

......
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

參數(shù)win描述的即為要增加的WindowState對象,而參數(shù)index描述的即為要將參數(shù)win所描述的WindowState對象及其子WindowState對象要增加到窗口堆棧中的起始位置。

由于參數(shù)win所描述的WindowState對象的子WindowState對象的成員變量mSubLayer的值可能會小于0,也可能大于0。大于0的子WindowState對象位于參數(shù)win所描述的WindowState對象的上面,而小于0的子WindowState對象位于參數(shù)win所描述的WindowState對象的下面。因此,WindowManagerService類的成員函數(shù)reAddWindowLocked先增加那些小于0的子WindowState對象,接著再增加參數(shù)win所描述的WindowState對象,最后增加那些大于0的子WindowState對象。

假設(shè)WindowManagerService類的成員函數(shù)reAddWindowLocked一共在窗口堆棧中增加了N個WindowState對象,那么它的返回值就等于index + N,這樣調(diào)用者就可以知道參數(shù)win所描述的WindowState對象及其子WindowState對象在窗口堆棧中的最高位置是多少。

基于第9、第10和第11這三操作,可以組合成很多其它的WindowState操作,如接下來的第12、第13、第14和第15個操作所示。

12. 將一個WindowState對象及其所有子WindowState對象增加到窗口堆棧中

將一個WindowState對象及其所有子WindowState對象增加到窗口堆棧中是通過調(diào)用WindowManagerService類的成員函數(shù)reAddWindowToListInOrderLocked來實現(xiàn)的,如下所示:

復(fù)制代碼 代碼如下:

public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor {
......

private void reAddWindowToListInOrderLocked(WindowState win) {
addWindowToListInOrderLocked(win, false);
// This is a hack to get all of the child windows added as well
// at the right position. Child windows should be rare and
// this case should be rare, so it shouldn't be that big a deal.
int wpos = mWindows.indexOf(win);
if (wpos >= 0) {
......
mWindows.remove(wpos);
mWindowsChanged = true;
reAddWindowLocked(wpos, win);
}
}

......
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

為了得到參數(shù)win所描述的WindowState對象的子WindowState對象在窗口堆棧中的起始位置,WindowManagerService類的成員函數(shù)reAddWindowToListInOrderLocked首先將參數(shù)win所描述的WindowState對象增加到窗口堆棧中,這是通過調(diào)用前面所分析的成員函數(shù)addWindowToListInOrderLocked來實現(xiàn)的,目的是為了獲得它在窗口堆棧的位置。有了這個位置之后,WindowManagerService類的成員函數(shù)reAddWindowToListInOrderLocked就可以調(diào)用前面所分析的成員函數(shù)reAddWindowLocked來將WindowState對象及其所有子WindowState對象增加到窗口堆棧中去了,不過在調(diào)用之前,要先將參數(shù)win所描述的WindowState對象從窗口中堆棧刪除。

13. 將一個WindowToken對象對應(yīng)的所有WindowState對象及其子WindowState對象增加到窗口堆棧的指定位置上

將一個WindowToken對象對應(yīng)的所有WindowState對象都增加到窗口堆棧中是通過調(diào)用WindowManagerService類的成員函數(shù)reAddAppWindowsLocked來實現(xiàn)的,如下所示:

復(fù)制代碼 代碼如下:

public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor {
......

private final int reAddAppWindowsLocked(int index, WindowToken token) {
final int NW = token.windows.size();
for (int i=0; i<NW; i++) {
index = reAddWindowLocked(index, token.windows.get(i));
}
return index;
}

......
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

與參數(shù)token所描述的WindowToken對象所對應(yīng)的WindowState對象保存在它的成員變量windows所描述的一個ArrayList中。通過遍歷這個ArrayList,就可以將與參數(shù)token所描述的WindowToken對象所對應(yīng)的WindowState對象及其子WindowState對象都增加到窗口堆棧的指定的起始位置上去,這是通過調(diào)用前面所分析的成員函數(shù)reAddWindowLocked來實現(xiàn)的。

參數(shù)index描述的便是最初指定的起始位置,每一次調(diào)用WindowManagerService類的成員函數(shù)reAddWindowLocked之后,它的值都便會被更新為下一個WindowState對象及其子WindowState對象要增加到窗口堆棧中的位置。

最后,WindowManagerService類的成員函數(shù)reAddAppWindowsLocked將與參數(shù)token所描述的WindowToken對象所對應(yīng)的WindowState對象在窗口堆棧中的最高位置加1后的得到結(jié)果返回給調(diào)用者。

14. 將一個AppWindowToken對象所對應(yīng)的WindowState對象及其子 WindowState對象移動到窗口堆棧的指定位置上

將一個AppWindowToken對象所對應(yīng)的WindowState對象及其子 WindowState對象移動到窗口堆棧的指定位置上是通過調(diào)用WindowManagerService類的成員函數(shù)moveAppWindowsLocked來實現(xiàn)的,如下所示:

復(fù)制代碼 代碼如下:

public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor {
......

private void moveAppWindowsLocked(AppWindowToken wtoken, int tokenPos,
boolean updateFocusAndLayout) {
// First remove all of the windows from the list.
tmpRemoveAppWindowsLocked(wtoken);

// Where to start adding?
int pos = findWindowOffsetLocked(tokenPos);

// And now add them back at the correct place.
pos = reAddAppWindowsLocked(pos, wtoken);

if (updateFocusAndLayout) {
if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES)) {
assignLayersLocked();
}
mLayoutNeeded = true;
performLayoutAndPlaceSurfacesLocked();
}
}

......
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

參數(shù)wtoken描述的是要移動其所對應(yīng)的WindowState對象的一個AppWindowToken對象,而參數(shù)tokenPos描述的是該AppWindowToken對象在WindowManagerService服務(wù)內(nèi)部的AppWindowToken列表中的新位置。

WindowManagerService類的成員函數(shù)moveAppWindowsLocked首先調(diào)用前面所分析的成員函數(shù)tmpRemoveAppWindowsLocked來移除所有與參數(shù)wtoken所描述的AppWindowToken對象所對應(yīng)的WindowState對象,接著再調(diào)用也是前面所分析的成員函數(shù)findWindowOffsetLocked來獲得與參數(shù)wtoken所描述的AppWindowToken對象所對應(yīng)的WindowState對象在窗口堆棧中的起始位置。有了這個起始位置之后,就可以也是前面所分析的成員函數(shù)reAddAppWindowsLocked來將與參數(shù)wtoken所描述的AppWindowToken對象所對應(yīng)的WindowState對象及其子WindowState對象移動到窗口堆棧上去了。

最后,如果參數(shù)updateFocusAndLayout的值等于true,那么WindowManagerService類的成員函數(shù)moveAppWindowsLocked還會更新系統(tǒng)當(dāng)前獲得焦點(diǎn)的窗口,以及重新計算系統(tǒng)中的所有窗口的Z軸位置以及重新布局系統(tǒng)中的所有窗口,這三個操作分別是通過調(diào)用WindowManagerService類的成員函數(shù)updateFocusedWindowLocked、assignLayersLocked和performLayoutAndPlaceSurfacesLocked來實現(xiàn)的。

15. 將一組AppWindowToken對象所對應(yīng)的WindowState對象及其子 WindowState對象移動到窗口堆棧的指定位置上

將一組AppWindowToken對象所對應(yīng)的WindowState對象及其子WindowState對象移動到窗口堆棧的指定位置上是通過調(diào)用WindowManagerService類的另外一個版本的成員函數(shù)moveAppWindowsLocked來實現(xiàn)的,如下所示:

復(fù)制代碼 代碼如下:

public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor {
......

private void moveAppWindowsLocked(List<IBinder> tokens, int tokenPos) {
// First remove all of the windows from the list.
final int N = tokens.size();
int i;
for (i=0; i<N; i++) {
WindowToken token = mTokenMap.get(tokens.get(i));
if (token != null) {
tmpRemoveAppWindowsLocked(token);
}
}

// Where to start adding?
int pos = findWindowOffsetLocked(tokenPos);

// And now add them back at the correct place.
for (i=0; i<N; i++) {
WindowToken token = mTokenMap.get(tokens.get(i));
if (token != null) {
pos = reAddAppWindowsLocked(pos, token);
}
}

if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES)) {
assignLayersLocked();
}
mLayoutNeeded = true;
performLayoutAndPlaceSurfacesLocked();

//dump();
}

......
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

這個操作與前面分析的第14個操作是類似,區(qū)別只在于前者是批量地移動一組AppWindowToken對象所對應(yīng)的WindowState對象及其子 WindowState對象,而后者是只移動一個AppWindowToken對象所對應(yīng)的WindowState對象及其子WindowState對象,此外,前者總是會調(diào)用WindowManagerService類的成員函數(shù)updateFocusedWindowLocked、assignLayersLocked和performLayoutAndPlaceSurfacesLocked來更新系統(tǒng)當(dāng)前獲得焦點(diǎn)的窗口、以及重新計算每一個窗口的Z軸位置,并且對這些窗口進(jìn)行重新布局。

至此,我們就分析完成WindowManagerService服務(wù)組織系統(tǒng)中的窗口的方式了。從分析的過程中,可以得到以下結(jié)論:

1. WindowManagerService服務(wù)維護(hù)有一個AppWindowToken堆棧和一個WindowState堆棧,它們與ActivityManagerService服務(wù)維護(hù)的Actvity堆棧是有關(guān)相同的Z軸位置關(guān)系的。

2. ActivityManagerService服務(wù)中的每一個ActivityRecord對象在WindowManagerService服務(wù)中都對應(yīng)有一個AppWindowToken對象,而WindowManagerService服務(wù)中的每一個AppWindowToken對象都對應(yīng)有一組WindowState對象。

3. 在WindowState堆棧中,AppWindowToken堆棧中的第i+1個AppWindowToken對象所對應(yīng)的WindowState對象都位于第i個AppWindowToken對象所對應(yīng)的WindowState對象的上面。

4. 一個WindowState對象可以附加在另外一個WindowState對象上面,此外,一個WindowState對象還可以有子WindowState對象,它們都是與同一個AppWindowToken對象或者WindowToken對象所對應(yīng)的。

5. WindowManagerService服務(wù)有兩個特殊的WindowToken,它們分別用來描述系統(tǒng)中的輸入法窗口令牌和壁紙窗口令牌,其中,輸入法窗口位于需要輸入法的窗口的上面,而壁紙窗口位于需要壁紙的窗口的下面。

最后,我們可以將WindowManagerService服務(wù)中的AppWindowToken理解成一個Activity組件令牌,而將它所對應(yīng)的WindowState對象理解成一個Activity窗口。有了這些概念之后,就為學(xué)習(xí)WindowManagerService服務(wù)的各種實現(xiàn)打下堅實的基礎(chǔ)。在接下來的兩篇文章中,我們就會在本文的基礎(chǔ)上,繼續(xù)分析WindowManagerService服務(wù)是如何管理系統(tǒng)中的輸入法窗口和壁紙窗口的,敬請關(guān)注!

相關(guān)文章

最新評論

日韩美女精品视频在线观看网站| 五月天中文字幕内射| 成人久久精品一区二区三区| 欧美日韩情色在线观看| 色在线观看视频免费的| 精品日产卡一卡二卡国色天香| 亚洲一级特黄特黄黄色录像片| 午夜精品一区二区三区4| 青青社区2国产视频| 亚洲综合一区二区精品久久| 成人高潮aa毛片免费| 日本三极片中文字幕| 一区二区免费高清黄色视频| 青青青青青青青在线播放视频| 亚洲激情,偷拍视频| 18禁美女黄网站色大片下载| 国产高清97在线观看视频| 日日夜夜精品一二三| 丝袜国产专区在线观看| 日本韩国亚洲综合日韩欧美国产 | 偷拍3456eee| 欧美视频不卡一区四区| 操操网操操伊剧情片中文字幕网| 精品国产亚洲av一淫| 亚洲国产成人av在线一区| 国产+亚洲+欧美+另类| 丝袜国产专区在线观看| 天天日天天干天天爱| 中文字幕在线乱码一区二区| 精品久久久久久久久久久99| 做爰视频毛片下载蜜桃视频1| 日本中文字幕一二区视频| 亚洲人妻30pwc| 欧美黄色录像免费看的| 午夜精品九一唐人麻豆嫩草成人| 99热久久极品热亚洲| 视频二区在线视频观看| 国产精品人妻66p| 国产精品入口麻豆啊啊啊| 亚洲图库另类图片区| 亚洲高清国产一区二区三区| 色综合久久久久久久久中文| 亚洲少妇高潮免费观看| 国际av大片在线免费观看| 日韩成人性色生活片| 大香蕉大香蕉在线有码 av| 成人av天堂丝袜在线观看| 成人精品在线观看视频| 午夜毛片不卡免费观看视频| 在线观看免费av网址大全| 在线免费观看靠比视频的网站| 大鸡巴操娇小玲珑的女孩逼| 在线成人日韩av电影| 午夜精品一区二区三区更新| 日韩av有码中文字幕| 天天射夜夜操狠狠干| 日本高清成人一区二区三区| 一级黄片久久久久久久久| 97青青青手机在线视频| 啪啪啪啪啪啪啪啪啪啪黄色| 大香蕉大香蕉在线看| 精品区一区二区三区四区人妻 | 亚洲欧美精品综合图片小说| 亚洲一区二区三区精品视频在线| 97少妇精品在线观看| 91亚洲国产成人精品性色| 天天干天天操天天扣| 漂亮 人妻被中出中文| 99热99这里精品6国产| 99热久久极品热亚洲| 午夜精品福利91av| 姐姐的朋友2在线观看中文字幕 | 国产va在线观看精品| jiujiure精品视频在线| 性色蜜臀av一区二区三区| 国产又色又刺激在线视频| 免费十精品十国产网站| 哥哥姐姐综合激情小说| av成人在线观看一区| 精品久久久久久久久久久99| 在线国产精品一区二区三区| 欧美伊人久久大香线蕉综合| 93人妻人人揉人人澡人人| 欧美另类z0z变态| 婷婷午夜国产精品久久久| 国产白袜脚足J棉袜在线观看| 国产成人精品久久二区91| 午夜毛片不卡免费观看视频| 九九视频在线精品播放| 青娱乐最新视频在线| 一级黄色片夫妻性生活| 超级av免费观看一区二区三区| gay gay男男瑟瑟在线网站| 亚洲伊人久久精品影院一美女洗澡 | 欧美成人黄片一区二区三区 | 亚洲 中文 自拍 无码| 搡老熟女一区二区在线观看| 午夜婷婷在线观看视频| 大陆精品一区二区三区久久| 小穴多水久久精品免费看| 中文字幕人妻av在线观看| 日韩激情文学在线视频| 18禁美女羞羞免费网站| 欧洲国产成人精品91铁牛tv| 国产自拍在线观看成人| 久久综合老鸭窝色综合久久| 国产高清在线在线视频| 蜜桃久久久久久久人妻| 夜色17s精品人妻熟女| 日本熟女50视频免费| 欧美精品资源在线观看| 51国产偷自视频在线播放| 特黄老太婆aa毛毛片| 欧洲精品第一页欧洲精品亚洲 | 人妻激情图片视频小说| 3344免费偷拍视频| 18禁污污污app下载| 天天摸天天亲天天舔天天操天天爽| 亚洲天堂有码中文字幕视频| 国产又粗又黄又硬又爽| 久久亚洲天堂中文对白| 成人24小时免费视频| 999久久久久999| 天堂女人av一区二区| 日韩美av高清在线| 中文字幕高清资源站| yellow在线播放av啊啊啊| 福利午夜视频在线观看| 日本性感美女三级视频| 欧美专区日韩专区国产专区| 最新的中文字幕 亚洲| 中文字幕日韩无敌亚洲精品| 人妻少妇性色欲欧美日韩| 黄网十四区丁香社区激情五月天| 日本免费一级黄色录像| 综合精品久久久久97| 男人操女人的逼免费视频| 亚洲变态另类色图天堂网| 国产黄色a级三级三级三级| 亚洲一级美女啪啪啪| 51精品视频免费在线观看| 午夜免费观看精品视频| 日本av在线一区二区三区| 亚洲一级av无码一级久久精品| 国产精品精品精品999| 中文字幕高清资源站| 中文字幕人妻熟女在线电影| 国产乱弄免费视频观看| 国产成人精品一区在线观看 | 任我爽精品视频在线播放| 操操网操操伊剧情片中文字幕网| 欧美黄片精彩在线免费观看| 国产精品日韩欧美一区二区| 国产使劲操在线播放| 美女少妇亚洲精选av| 午夜场射精嗯嗯啊啊视频| 激情国产小视频在线| 农村胖女人操逼视频| 青青青艹视频在线观看| 国产一区二区在线欧美| 75国产综合在线视频| 在线不卡成人黄色精品| 100%美女蜜桃视频| 看一级特黄a大片日本片黑人| 欧美一级色视频美日韩| 久久久久久97三级| 91九色国产porny蝌蚪| 黄色视频在线观看高清无码 | 免费高清自慰一区二区三区网站| 五十路人妻熟女av一区二区| 国产之丝袜脚在线一区二区三区| 欧美乱妇无乱码一区二区| 在线观看操大逼视频| 最新欧美一二三视频| 精彩视频99免费在线| 国产在线自在拍91国语自产精品 | 曰本无码人妻丰满熟妇啪啪| 在线观看免费视频色97| 熟女国产一区亚洲中文字幕| 在线视频这里只有精品自拍| 成年人啪啪视频在线观看| 欧美一级片免费在线成人观看| 日本精品一区二区三区在线视频。| 美女福利视频网址导航| 国产aⅴ一线在线观看| 含骚鸡巴玩逼逼视频| 黄色成年网站午夜在线观看| 国产白嫩美女一区二区| 日本韩国亚洲综合日韩欧美国产| 黄色成年网站午夜在线观看| 五十路熟女人妻一区二区9933| 国产九色91在线观看精品| 国产精品一区二区av国| 黄色av网站免费在线| 蜜桃久久久久久久人妻| 六月婷婷激情一区二区三区| jul—619中文字幕在线| 国产又粗又黄又硬又爽| 中文字幕av第1页中文字幕| 亚洲在线一区二区欧美| 亚洲一区二区三区精品乱码| 国产女孩喷水在线观看| 青草青永久在线视频18| 中文字幕在线观看国产片| 午夜婷婷在线观看视频| 同居了嫂子在线播高清中文| 黑人变态深video特大巨大| 99热久久这里只有精品| 亚洲成人线上免费视频观看| 婷婷久久一区二区字幕网址你懂得 | 久久热久久视频在线观看| 少妇与子乱在线观看| 午夜精品一区二区三区福利视频| 精品国产午夜视频一区二区| aiss午夜免费视频| 天天干天天日天天干天天操| 精品91高清在线观看| 欧美va亚洲va天堂va| 影音先锋女人av噜噜色| 亚洲成人av在线一区二区| 97成人免费在线观看网站| 亚洲天天干 夜夜操| 午夜极品美女福利视频| 亚洲无线观看国产高清在线| 亚洲精品亚洲人成在线导航| 国产一区二区久久久裸臀| 狍和女人的王色毛片| 人妻自拍视频中国大陆| 亚洲一级av大片免费观看| 韩国亚洲欧美超一级在线播放视频 | 久草视频在线免播放| 又黄又刺激的午夜小视频| 国产成人精品一区在线观看| 伊人综合aⅴ在线网| 国产午夜亚洲精品不卡在线观看| 97超碰最新免费在线观看| 美女视频福利免费看| 国产中文字幕四区在线观看| 亚洲推理片免费看网站| 欧美偷拍自拍色图片| 亚洲成人激情视频免费观看了| 大尺度激情四射网站| lutube在线成人免费看| 久草视频在线看免费| 精品美女在线观看视频在线观看| 伊拉克及约旦宣布关闭领空| 亚洲丝袜老师诱惑在线观看| 午夜精品在线视频一区| 午夜毛片不卡免费观看视频 | 蜜桃视频在线欧美一区| 一区二区免费高清黄色视频| 91福利视频免费在线观看| 亚洲欧美精品综合图片小说| 亚洲人妻30pwc| 久久三久久三久久三久久| 人人妻人人爱人人草| 2020久久躁狠狠躁夜夜躁 | 狠狠操狠狠操免费视频| 天天日天天日天天射天天干| 一个人免费在线观看ww视频| 我想看操逼黄色大片| 岛国一区二区三区视频在线| 国产免费av一区二区凹凸四季| 91亚洲精品干熟女蜜桃频道| 免费黄高清无码国产| 欧美一级片免费在线成人观看| 女生自摸在线观看一区二区三区| 一区二区麻豆传媒黄片| 中文字幕日韩91人妻在线| 免费高清自慰一区二区三区网站 | 扒开腿挺进肉嫩小18禁视频| 日本五十路熟新垣里子| 人妻久久久精品69系列| 97成人免费在线观看网站| 超碰中文字幕免费观看| 99精品免费观看视频 | 香港一级特黄大片在线播放| av大全在线播放免费| 中文字幕综合一区二区| 大香蕉日本伊人中文在线| 天天干天天操天天玩天天射| 国产美女午夜福利久久| 欧美老鸡巴日小嫩逼| 天天操天天干天天艹| 五十路av熟女松本翔子| 2018在线福利视频| 99热99这里精品6国产| 中文字幕在线乱码一区二区| 黄色片年轻人在线观看| 人妻无码中文字幕专区| 天天干天天操天天扣| 99精品国产免费久久| 亚洲中文字幕校园春色| 成人影片高清在线观看 | 亚洲天堂成人在线观看视频网站| 一级黄色片夫妻性生活| 亚洲精品 日韩电影| 亚洲av自拍天堂网| 久久精品视频一区二区三区四区| 亚洲精品久久视频婷婷| 天堂av在线播放免费| 韩国女主播精品视频网站| 99热99这里精品6国产| 女生被男生插的视频网站| av新中文天堂在线网址| 中文字幕第三十八页久久| 91精品高清一区二区三区| 国内精品在线播放第一页| 和邻居少妇愉情中文字幕| 免费在线观看污污视频网站| 天天日天天干天天舔天天射| 视频 一区二区在线观看| 青草久久视频在线观看| 一色桃子久久精品亚洲| 亚洲一区二区三区久久受| 红桃av成人在线观看| 在线视频自拍第三页| 成年女人免费播放视频| 亚洲欧美国产麻豆综合| 亚洲一区自拍高清免费视频| 最新的中文字幕 亚洲| 午夜精品一区二区三区城中村| 成人综合亚洲欧美一区 | 3344免费偷拍视频| 精品久久久久久久久久久久人妻| 最近的中文字幕在线mv视频| 最新的中文字幕 亚洲| 2018在线福利视频| 亚洲午夜高清在线观看| 色偷偷伊人大杳蕉综合网 | 丝袜美腿欧美另类 中文字幕| 成人av久久精品一区二区| 亚洲综合自拍视频一区| 97香蕉碰碰人妻国产樱花| 91麻豆精品秘密入口在线观看| 97国产在线观看高清| 香港三日本三韩国三欧美三级| 亚洲免费在线视频网站| 国产麻豆剧果冻传媒app| 亚洲精品色在线观看视频| 中文字幕亚洲中文字幕| 成人精品在线观看视频| 精品亚洲国产中文自在线| 亚洲区欧美区另类最新章节| 女同久久精品秋霞网| 亚洲综合乱码一区二区| 免费在线播放a级片| 高清成人av一区三区| 在线观看视频污一区| 日韩写真福利视频在线观看| tube69日本少妇| 99一区二区在线观看| 国产精品自偷自拍啪啪啪| 日韩精品电影亚洲一区| 啊啊好大好爽啊啊操我啊啊视频| asmr福利视频在线观看| 亚洲一区二区三区在线高清| caoporm超碰国产| 三上悠亚和黑人665番号| 久草极品美女视频在线观看| 欧美一区二区三区四区性视频| 狍和女人的王色毛片| 人妻少妇亚洲精品中文字幕| 在线不卡成人黄色精品| 蜜桃视频在线欧美一区| 天天日天天干天天舔天天射| 超黄超污网站在线观看| 中国把吊插入阴蒂的视频| 国产又粗又硬又猛的毛片视频| 男人的天堂一区二区在线观看| 亚洲国际青青操综合网站| 18禁网站一区二区三区四区 | 男人在床上插女人视频| 香港一级特黄大片在线播放| 国产欧美精品不卡在线| 国产精品久久久久久久女人18| 污污小视频91在线观看| 女人精品内射国产99| 51国产成人精品视频| 欧美另类一区二区视频| 日本少妇人妻xxxxxhd| av中文字幕电影在线看| 黄色片黄色片wyaa| 国产品国产三级国产普通话三级| 日本免费一级黄色录像| 久草电影免费在线观看| 99精品免费久久久久久久久a| 日韩精品电影亚洲一区| 97人妻夜夜爽二区欧美极品| sejizz在线视频| 中文字日产幕乱六区蜜桃| 亚洲中文字幕校园春色| 精品国产在线手机在线| 91色网站免费在线观看| 亚洲av自拍天堂网| 久久久久久九九99精品| 99re国产在线精品| 人妻少妇性色欲欧美日韩| 国产露脸对白在线观看| 亚洲国产香蕉视频在线播放| 最新激情中文字幕视频| 日韩精品一区二区三区在线播放| 人人超碰国字幕观看97| 国产极品精品免费视频| 大香蕉日本伊人中文在线| 美女被肏内射视频网站| 午夜精品九一唐人麻豆嫩草成人| 国产日本精品久久久久久久| 黑人性生活视频免费看| 日本黄色特一级视频| 久草免费人妻视频在线| 伊人日日日草夜夜草| 亚洲av成人网在线观看| 老司机免费福利视频网| 婷婷综合亚洲爱久久| 日日夜夜大香蕉伊人| 97黄网站在线观看| 人妻无码色噜噜狠狠狠狠色| 国产九色91在线观看精品| 午夜av一区二区三区| 少妇与子乱在线观看| 一色桃子久久精品亚洲| 国产精品成人xxxx| 丝袜肉丝一区二区三区四区在线| nagger可以指黑人吗| 婷婷综合蜜桃av在线| 欧美日韩亚洲国产无线码| 日日爽天天干夜夜操| 极品粉嫩小泬白浆20p主播| 青青青青青手机视频| 三级等保密码要求条款| 日本一二三中文字幕| 天天干天天爱天天色| 国产精品久久久久网| 国产实拍勾搭女技师av在线| 免费在线观看污污视频网站| 成人av电影免费版| 欧美另类一区二区视频| 日本成人不卡一区二区| 午夜精品一区二区三区更新| 人妻少妇性色欲欧美日韩| 青娱乐在线免费视频盛宴| av网址在线播放大全| 人妻另类专区欧美制服| 亚洲成人精品女人久久久| 天天夜天天日天天日| 日本少妇人妻xxxxxhd| 一区二区三区四区五区性感视频| wwwxxx一级黄色片| 日本美女成人在线视频| 一区二区三区 自拍偷拍| 在线观看视频一区麻豆| 久久久久久cao我的性感人妻 | 美女张开腿让男生操在线看| 蜜桃视频17c在线一区二区| 性感美女高潮视频久久久| 日韩av有码一区二区三区4| 国产精品国产三级国产午| 久久久久久久久久久免费女人| 欧美性感尤物人妻在线免费看| 宅男噜噜噜666国产| 欧美亚洲牲夜夜综合久久| 亚洲另类在线免费观看| 日韩亚国产欧美三级涩爱| 午夜精彩视频免费一区| 亚洲自拍偷拍精品网| 在线视频免费观看网| 伊人综合aⅴ在线网| 66久久久久久久久久久| 19一区二区三区在线播放| 最新黄色av网站在线观看| 顶级尤物粉嫩小尤物网站| 国产精品中文av在线播放 | 国产精品黄片免费在线观看| 日本阿v视频在线免费观看| 人妻少妇一区二区三区蜜桃| 啪啪啪啪啪啪啪免费视频| 天天干天天操天天爽天天摸| 美女吃鸡巴操逼高潮视频| 91社福利《在线观看| 欧美韩国日本国产亚洲| 在线观看免费视频网| 午夜精品福利91av| 亚洲精品久久视频婷婷| 亚洲精品精品国产综合| 国产视频网站国产视频| 黑人乱偷人妻中文字幕| 美女福利视频导航网站| 夜夜嗨av一区二区三区中文字幕| 大香蕉大香蕉在线有码 av| 午夜国产福利在线观看| 国产av一区2区3区| 国产精品久久久久久久久福交| 青青草在观免费国产精品| 91福利视频免费在线观看| 夫妻在线观看视频91| 曰本无码人妻丰满熟妇啪啪| 少妇深喉口爆吞精韩国| 精品日产卡一卡二卡国色天香| 女同互舔一区二区三区| 端庄人妻堕落挣扎沉沦| 欧美色呦呦最新网址| 亚洲免费福利一区二区三区| 日日日日日日日日夜夜夜夜夜夜| 91国产资源在线视频| 最新97国产在线视频| 日曰摸日日碰夜夜爽歪歪| 爱爱免费在线观看视频| 国产精品成人xxxx| 午夜精品一区二区三区城中村| 在线国产中文字幕视频| 婷婷久久一区二区字幕网址你懂得| 视频一区 二区 三区 综合| 一级黄片久久久久久久久| 亚洲麻豆一区二区三区| 视频一区二区三区高清在线| 综合色区亚洲熟妇shxstz| 午夜精品一区二区三区更新| 午夜在线观看一区视频| 美女日逼视频免费观看| 亚洲的电影一区二区三区| 无套猛戳丰满少妇人妻| 九九视频在线精品播放| 在线观看国产网站资源| 中文字幕日韩无敌亚洲精品 | 午夜精品亚洲精品五月色| 93精品视频在线观看| 唐人色亚洲av嫩草| 亚洲欧美国产综合777| 在线免费观看av日韩| 天天干天天日天天干天天操| 91九色porny蝌蚪国产成人| 久久久91蜜桃精品ad| 色爱av一区二区三区| 天天操夜夜骑日日摸| 91精品激情五月婷婷在线| 青青青青草手机在线视频免费看| av在线播放国产不卡| 欧美特色aaa大片| 人妻少妇亚洲一区二区| 国产成人综合一区2区| 中文字幕熟女人妻久久久| 亚洲成人熟妇一区二区三区 | 亚洲在线免费h观看网站| 97人妻无码AV碰碰视频| 十八禁在线观看地址免费| 丝袜肉丝一区二区三区四区在线| 在线观看国产免费麻豆| 亚洲精品国产久久久久久| 99精品免费观看视频 | 日韩成人免费电影二区| 老熟妇凹凸淫老妇女av在线观看| 亚洲熟妇无码一区二区三区| 真实国产乱子伦一区二区| 天天操天天操天天碰| 99国产精品窥熟女精品| 色婷婷综合激情五月免费观看| 2025年人妻中文字幕乱码在线| eeuss鲁片一区二区三区| 国产精品人妻熟女毛片av久| 精产国品久久一二三产区区别| 精品一区二区三区在线观看| 被大鸡吧操的好舒服视频免费| av中文字幕网址在线| 99久久成人日韩欧美精品| 成人福利视频免费在线| 欧美亚洲中文字幕一区二区三区| 国产午夜男女爽爽爽爽爽视频| 91极品大一女神正在播放| 青青青青青操视频在线观看| 亚洲一区制服丝袜美腿| av在线免费中文字幕| 国产黄色片蝌蚪九色91| 欲乱人妻少妇在线视频裸| 亚洲特黄aaaa片| 在线新三级黄伊人网| 精品黑人巨大在线一区| 男人操女人逼逼视频网站| 成人伊人精品色xxxx视频| 人妻少妇亚洲精品中文字幕| 中国视频一区二区三区| 伊人开心婷婷国产av| 欧美伊人久久大香线蕉综合| 天天日天天天天天天天天天天 | 4个黑人操素人视频网站精品91| 性色av一区二区三区久久久| 国产精品探花熟女在线观看| 爱爱免费在线观看视频| 亚洲国产香蕉视频在线播放| 免费观看污视频网站| 欧美视频一区免费在线| 天堂av在线播放免费| 老鸭窝日韩精品视频观看| av老司机亚洲一区二区| 亚洲美女美妇久久字幕组| 老熟妇凹凸淫老妇女av在线观看| 中文字幕视频一区二区在线观看| 日韩二区视频一线天婷婷五| 精品一线二线三线日本| 91色老99久久九九爱精品| 丝袜长腿第一页在线| 日本男女操逼视频免费看| 午夜精品一区二区三区更新| 少妇人妻久久久久视频黄片| av一本二本在线观看| 欧美3p在线观看一区二区三区| 亚洲精品麻豆免费在线观看| 免费在线观看污污视频网站| 一区二区三区美女毛片| 91精品一区二区三区站长推荐| 日本女大学生的黄色小视频| 欧美精品黑人性xxxx| 视频久久久久久久人妻| 亚洲自拍偷拍综合色| 精品久久久久久久久久久a√国产| 久久久久久99国产精品| 精品一区二区三区欧美| 福利午夜视频在线观看| 成年人黄视频在线观看| 中文字幕日韩精品就在这里| 九一传媒制片厂视频在线免费观看 | 超碰97人人做人人爱| 成人av电影免费版| 亚洲一区二区人妻av| 99久久99一区二区三区| 亚洲综合在线视频可播放| 欧美视频不卡一区四区| 99热国产精品666| 天堂av在线播放免费| 亚洲成人熟妇一区二区三区 | 粗大的内捧猛烈进出爽大牛汉子| 日韩美女精品视频在线观看网站| 成年人免费看在线视频| 在线观看成人国产电影| 免费男阳茎伸入女阳道视频| 五十路人妻熟女av一区二区| 亚洲男人在线天堂网| 国产午夜亚洲精品麻豆| 综合页自拍视频在线播放| 国产又大又黄免费观看| 国产黄色a级三级三级三级| 亚洲熟妇久久无码精品| 偷拍自拍亚洲视频在线观看| 午夜婷婷在线观看视频| 精品人妻伦一二三区久| 97超碰国语国产97超碰| 动漫美女的小穴视频| 国产品国产三级国产普通话三级| 天天射夜夜操狠狠干| 在线观看视频 你懂的| 91在线免费观看成人| 欧美日韩一级黄片免费观看| 人妻熟女中文字幕aⅴ在线| 欧洲欧美日韩国产在线| 午夜免费观看精品视频| 中文字幕无码日韩专区免费| 久久国产精品精品美女| 天天射,天天操,天天说| 免费岛国喷水视频在线观看| 在线免费观看视频一二区| 久久久久只精品国产三级| 4个黑人操素人视频网站精品91| 婷婷综合亚洲爱久久| 99热这里只有精品中文| 鸡巴操逼一级黄色气| 日本脱亚入欧是指什么| 午夜极品美女福利视频| 3337p日本欧洲大胆色噜噜| 国产成人综合一区2区| 欧美专区日韩专区国产专区| av天堂中文字幕最新| 97国产福利小视频合集| 欧美日韩国产一区二区三区三州| 在线视频自拍第三页| 中文字幕av一区在线观看| 99热久久极品热亚洲| 嫩草aⅴ一区二区三区| 亚洲护士一区二区三区| 好太好爽好想要免费| 日比视频老公慢点好舒服啊| 国产精品大陆在线2019不卡| 中文字幕一区二 区二三区四区| 中文字幕在线观看极品视频| 天天日天天爽天天爽| 黄网十四区丁香社区激情五月天| 久久尻中国美女视频| 看一级特黄a大片日本片黑人| 国产成人自拍视频在线免费观看| japanese日本熟妇另类| 午夜频道成人在线91| 亚洲综合图片20p| 亚洲伊人久久精品影院一美女洗澡| 天天插天天色天天日| 天天日天天做天天日天天做| 国产精彩对白一区二区三区| 天天日夜夜操天天摸| weyvv5国产成人精品的视频| 中文字幕国产专区欧美激情| 热久久只有这里有精品| av乱码一区二区三区| 成人sm视频在线观看| 唐人色亚洲av嫩草| av天堂加勒比在线| av网址国产在线观看| 日日爽天天干夜夜操| 青青青激情在线观看视频| 黄色视频在线观看高清无码| 欧美一区二区三区啪啪同性| 日韩av中文在线免费观看| 99re6热在线精品| 国产精品久久久久久久女人18| 97香蕉碰碰人妻国产樱花| gogo国模私拍视频| 在线免费观看日本伦理| 不卡精品视频在线观看| 不卡一不卡二不卡三| 日韩三级电影华丽的外出| 久久久久国产成人精品亚洲午夜| 在线视频精品你懂的| 少妇露脸深喉口爆吞精| 2012中文字幕在线高清| 丁香花免费在线观看中文字幕| 大屁股熟女一区二区三区| 精品一区二区三区三区色爱| 亚洲中文精品人人免费| 十八禁在线观看地址免费| 91久久国产成人免费网站| 国产污污污污网站在线| 欧美一区二区三区高清不卡tv| 免费av岛国天堂网站| 99精品国产aⅴ在线观看| 国产精品手机在线看片| 午夜精品福利91av| 91色网站免费在线观看| 日本丰满熟妇大屁股久久| 熟女91pooyn熟女| 日韩人妻xxxxx| 91色秘乱一区二区三区| 夜夜嗨av蜜臀av| 中文字幕日本人妻中出| 亚洲av可乐操首页| 新婚人妻聚会被中出| 日日操综合成人av| 人妻少妇av在线观看| 国产熟妇乱妇熟色T区| 社区自拍揄拍尻屁你懂的| mm131美女午夜爽爽爽| 大鸡八强奸视频在线观看| 国产精品3p和黑人大战| 久久精品亚洲成在人线a| 免费观看理论片完整版| 国产福利小视频免费观看| japanese五十路熟女熟妇| 青青草精品在线视频观看| 91麻豆精品91久久久久同性| 国产乱弄免费视频观看| 国产成人小视频在线观看无遮挡 | 久久精品视频一区二区三区四区| 中文字幕高清在线免费播放| 人妻激情图片视频小说| 久精品人妻一区二区三区| 91亚洲精品干熟女蜜桃频道| 晚上一个人看操B片| 大香蕉日本伊人中文在线| 九一传媒制片厂视频在线免费观看| 午夜精品一区二区三区福利视频| 国产极品精品免费视频| 啪啪啪18禁一区二区三区| 自拍偷拍 国产资源| 欧美视频综合第一页| 亚洲一区二区三区久久受| 午夜精品九一唐人麻豆嫩草成人| 欧美专区第八页一区在线播放| 国产va在线观看精品| 青青青青操在线观看免费| 好男人视频在线免费观看网站| 啊啊啊想要被插进去视频| 欧美视频一区免费在线| 超级av免费观看一区二区三区| 啊啊好大好爽啊啊操我啊啊视频| 欧美日韩高清午夜蜜桃大香蕉| 91麻豆精品久久久久| av在线免费中文字幕| 无码国产精品一区二区高潮久久4 日韩欧美一级精品在线观看 | 丝袜国产专区在线观看| 中文字幕一区二区三区人妻大片| 热思思国产99re| 免费成人av中文字幕| 国产午夜亚洲精品不卡在线观看| 97国产在线观看高清| 日本男女操逼视频免费看| 亚洲免费视频欧洲免费视频| 偷青青国产精品青青在线观看| 四虎永久在线精品免费区二区| 天天干天天操天天玩天天射| 亚洲第17页国产精品| 丰满的继坶3中文在线观看| 成人资源在线观看免费官网| 亚洲国产精品久久久久久6| 色偷偷伊人大杳蕉综合网| 中国熟女一区二区性xx| 大鸡巴插入美女黑黑的阴毛| 38av一区二区三区| 日韩视频一区二区免费观看| 亚洲的电影一区二区三区| 国产欧美日韩在线观看不卡| 91九色国产熟女一区二区| 2021年国产精品自拍| 精品一区二区三四区| 无码中文字幕波多野不卡| 伊拉克及约旦宣布关闭领空| 国产久久久精品毛片| 国产在线一区二区三区麻酥酥| 超级av免费观看一区二区三区| 欧洲日韩亚洲一区二区三区| 97人妻人人澡爽人人精品| 国产大学生援交正在播放| 在线免费观看亚洲精品电影| 一区二区三区另类在线| 日日夜夜精品一二三| 欧美日本在线视频一区| 久久久精品999精品日本| 精品一区二区三区三区色爱| 久久99久久99精品影院| 涩爱综合久久五月蜜臀| 91www一区二区三区| 美女小视频网站在线| 天天日天天敢天天干| 91精品国产高清自在线看香蕉网| 中文字幕av一区在线观看| 亚洲福利天堂久久久久久| 亚洲精品麻豆免费在线观看| 特级欧美插插插插插bbbbb| 成人色综合中文字幕| 午夜场射精嗯嗯啊啊视频| 国产九色91在线观看精品| jiujiure精品视频在线| 午夜精品一区二区三区城中村| 青青青青青青青在线播放视频| 天美传媒mv视频在线观看| 91快播视频在线观看| 欧美日韩v中文在线| 超碰中文字幕免费观看| 国产精品黄片免费在线观看| 小泽玛利亚视频在线观看| 久久久久久97三级| 精品国产亚洲av一淫| 国产黄色大片在线免费播放| 午夜精品福利91av| 99国产精品窥熟女精品| 97资源人妻免费在线视频| 揄拍成人国产精品免费看视频| 成人性黑人一级av| 全国亚洲男人的天堂| 午夜场射精嗯嗯啊啊视频| 国产大学生援交正在播放| av中文字幕福利网| 欧美怡红院视频在线观看| 激情综合治理六月婷婷| 国产麻豆乱子伦午夜视频观看| 国产av自拍偷拍盛宴| 最新日韩av传媒在线| 老师啊太大了啊啊啊尻视频| 亚洲欧美另类手机在线| 中文字幕,亚洲人妻| 欧美成人精品在线观看| 亚洲成av人无码不卡影片一| 91p0rny九色露脸熟女| 岛国毛片视频免费在线观看| 欧美黄色录像免费看的| 蝴蝶伊人久久中文娱乐网| 国产av自拍偷拍盛宴| 男女啪啪啪啪啪的网站| 视频久久久久久久人妻| 久久久精品欧洲亚洲av| 中文字幕1卡1区2区3区| 亚洲欧美综合另类13p| www,久久久,com| 国产又粗又猛又爽又黄的视频在线| 五十路息与子猛烈交尾视频| 99精品国产aⅴ在线观看| 亚洲一区制服丝袜美腿| 制服丝袜在线人妻中文字幕| 欧美一区二区三区在线资源| 日本精品一区二区三区在线视频。 | 日本人竟这样玩学生妹| 天堂女人av一区二区| 亚洲码av无色中文| 国内自拍第一页在线观看| 91中文字幕最新合集| 色综合天天综合网国产成人| 成年人黄色片免费网站| 成年人啪啪视频在线观看| 区一区二区三国产中文字幕| 国产三级影院在线观看| 999久久久久999| 黄色录像鸡巴插进去| 五月激情婷婷久久综合网| 久久精品36亚洲精品束缚| 99热99re在线播放| 巨乳人妻日下部加奈被邻居中出| 欧美精品亚洲精品日韩在线| 色综合天天综合网国产成人| 中文字幕在线第一页成人| 国产乱子伦精品视频潮优女| 中文字幕亚洲久久久| 蝴蝶伊人久久中文娱乐网| 亚洲精品高清自拍av| 青青青青视频在线播放| 在线国产精品一区二区三区| AV无码一区二区三区不卡| 特大黑人巨大xxxx| 青青草视频手机免费在线观看| 久久综合老鸭窝色综合久久| 国产精品人久久久久久| 97青青青手机在线视频| 黑人性生活视频免费看| 亚洲国产在线精品国偷产拍| 亚洲熟女综合色一区二区三区四区| 四川乱子伦视频国产vip| 国产精品三级三级三级| 日本在线一区二区不卡视频| asmr福利视频在线观看| 国产亚洲天堂天天一区| 国产九色91在线视频| 中文字幕中文字幕人妻| 黄色视频在线观看高清无码| 日本少妇的秘密免费视频| rct470中文字幕在线| 色婷婷综合激情五月免费观看| 中国视频一区二区三区| 老司机免费福利视频网| 亚洲激情偷拍一区二区| 好男人视频在线免费观看网站| 97人妻总资源视频| 一级a看免费观看网站| 又粗又硬又猛又爽又黄的| 最新的中文字幕 亚洲| 亚洲精品福利网站图片| 亚洲欧美在线视频第一页| 青青草精品在线视频观看| 一区二区三区av高清免费| 青青青激情在线观看视频| 91国产在线免费播放| 免费人成黄页网站在线观看国产| 91九色国产porny蝌蚪| 中文字幕+中文字幕| 一区二区三区四区中文| 亚洲av无码成人精品区辽| 大尺度激情四射网站| 天天摸天天亲天天舔天天操天天爽 | 国产视频一区二区午夜| 日韩在线中文字幕色| 这里有精品成人国产99| 日本精品美女在线观看| 91色秘乱一区二区三区| 中国视频一区二区三区| 中文字幕AV在线免费看 | 伊人情人综合成人久久网小说| 大陆精品一区二区三区久久| 黄色无码鸡吧操逼视频| 一本一本久久a久久精品综合不卡| 精品区一区二区三区四区人妻| 亚洲美女高潮喷浆视频| 久久久91蜜桃精品ad| 91国偷自产一区二区三区精品| 自拍偷拍 国产资源| asmr福利视频在线观看| japanese五十路熟女熟妇| 人人人妻人人澡人人| 任我爽精品视频在线播放| 不卡精品视频在线观看| 天堂中文字幕翔田av| 精品suv一区二区69| 亚洲1区2区3区精华液| 天天日天天干天天搡| 又粗又长 明星操逼小视频| 青青青视频手机在线观看| 狍和女人的王色毛片| 成人精品视频99第一页| yy96视频在线观看| 青青青国产免费视频| 男人天堂av天天操| 亚洲国产在人线放午夜| 成人国产小视频在线观看| 亚洲在线免费h观看网站| 中文字幕欧美日韩射射一| 少妇人妻久久久久视频黄片| 亚洲成人国产综合一区| 国产女人被做到高潮免费视频 | 欧美精品免费aaaaaa| 久久免费看少妇高潮完整版| 香蕉aⅴ一区二区三区| 国产精品久久9999| 精品视频一区二区三区四区五区| 人妻少妇av在线观看| 国产普通话插插视频| 91试看福利一分钟| 中文字幕一区二区人妻电影冢本| 中文字幕 人妻精品| 91老师蜜桃臀大屁股| 自拍偷拍亚洲欧美在线视频| 又色又爽又黄的美女裸体| 欧美另类一区二区视频| 亚洲成高清a人片在线观看| www,久久久,com| 亚洲天堂成人在线观看视频网站| 国产不卡av在线免费| 国产综合高清在线观看| av森泽佳奈在线观看| 亚洲中文字幕国产日韩| 欧美一区二区三区啪啪同性| 国产剧情演绎系列丝袜高跟| 91免费放福利在线观看 | 人妻少妇精品久久久久久| 欧美精品久久久久久影院| 日本黄色特一级视频| 欧美一级色视频美日韩| 天天色天天舔天天射天天爽| 亚洲国产欧美一区二区丝袜黑人| eeuss鲁片一区二区三区| 国产日韩一区二区在线看| 欧美精品黑人性xxxx| 午夜精品在线视频一区| 91亚洲精品干熟女蜜桃频道| 亚洲精品麻豆免费在线观看| 久久久久91精品推荐99| 99热这里只有国产精品6| 亚洲欧美日韩视频免费观看| 香蕉av影视在线观看| aⅴ精产国品一二三产品| AV天堂一区二区免费试看| 国产激情av网站在线观看| 熟女91pooyn熟女| 操操网操操伊剧情片中文字幕网| 国产午夜男女爽爽爽爽爽视频| 婷婷综合蜜桃av在线| 91精品啪在线免费| 一区二区在线观看少妇| 精彩视频99免费在线| 小泽玛利亚视频在线观看| 老司机免费视频网站在线看| 少妇系列一区二区三区视频| 国产老熟女伦老熟妇ⅹ| 大尺度激情四射网站| 日韩一区二区电国产精品| 日本韩国亚洲综合日韩欧美国产| mm131美女午夜爽爽爽| 91福利视频免费在线观看| 久久热这里这里只有精品| 日韩欧美一级aa大片| 在线观看国产免费麻豆| 亚洲精品久久综合久| 欧美视频一区免费在线| 亚洲免费成人a v| 中文字幕无码一区二区免费| 亚洲国产成人在线一区| 国产高清在线在线视频| 精品久久久久久高潮| 51国产偷自视频在线播放| 日本欧美视频在线观看三区| 亚洲熟妇x久久av久久| 亚洲中文字幕校园春色| 成人蜜臀午夜久久一区| 免费在线福利小视频| 狠狠地躁夜夜躁日日躁| 国产精品伦理片一区二区| 亚洲中文字幕综合小综合| 久草电影免费在线观看| 午夜精品亚洲精品五月色| 日美女屁股黄邑视频| 大鸡吧插逼逼视频免费看| 97瑟瑟超碰在线香蕉| 中文字母永久播放1区2区3区| 国产亚洲欧美视频网站| 操日韩美女视频在线免费看| 国产亚州色婷婷久久99精品| 黄色的网站在线免费看| 九色porny九色9l自拍视频| 成人激情文学网人妻 | 100%美女蜜桃视频| 欧美日韩国产一区二区三区三州| av在线免费中文字幕| 亚洲男人在线天堂网| 国产超码片内射在线| 久久久精品欧洲亚洲av| 亚洲综合色在线免费观看| 黄色片年轻人在线观看| 成人伊人精品色xxxx视频| 国产精品免费不卡av| 欧美viboss性丰满| 韩国男女黄色在线观看| 亚洲在线免费h观看网站| 在线观看操大逼视频| 日本精品美女在线观看| 国产真实乱子伦a视频| 综合激情网激情五月五月婷婷| 亚洲av自拍偷拍综合| 亚洲熟妇无码一区二区三区| 国产成人小视频在线观看无遮挡| 在线免费观看av日韩| 深夜男人福利在线观看| 女警官打开双腿沦为性奴| 夜夜嗨av蜜臀av| 欧美一区二区中文字幕电影 | 国产妇女自拍区在线观看| 青草青永久在线视频18| 啊啊好慢点插舔我逼啊啊啊视频| 久久久人妻一区二区| 最近的中文字幕在线mv视频| 日韩近亲视频在线观看| 一色桃子久久精品亚洲| 在线免费观看av日韩| 青娱乐极品视频青青草| 亚洲美女美妇久久字幕组| 不卡精品视频在线观看| 大香蕉伊人国产在线| 亚洲精品国品乱码久久久久 | 熟女人妻在线中出观看完整版 | 80电影天堂网官网| 在线免费观看99视频| 国产精品一区二区久久久av| 中国黄色av一级片| 人妻少妇精品久久久久久 | 大陆胖女人与丈夫操b国语高清| 大鸡八强奸视频在线观看| 丰满的继坶3中文在线观看| 欧美激情电影免费在线| av成人在线观看一区| 国产亚洲成人免费在线观看| 亚洲av日韩av网站| 欧美精品欧美极品欧美视频| 国产九色91在线视频| 日本真人性生活视频免费看| 亚洲蜜臀av一区二区三区九色| 淫秽激情视频免费观看| 美女大bxxxx内射| 99热色原网这里只有精品| 欧美一级片免费在线成人观看| 狠狠操狠狠操免费视频| 偷拍3456eee| 免费成人av中文字幕| 国产视频一区二区午夜| 懂色av蜜桃a v| 超碰在线观看免费在线观看 | 亚洲激情偷拍一区二区| huangse网站在线观看| 日辽宁老肥女在线观看视频| 丝袜肉丝一区二区三区四区在线看| 手机看片福利盒子日韩在线播放| 亚洲av成人网在线观看| 国产白袜脚足J棉袜在线观看| 美味人妻2在线播放| 日韩精品中文字幕在线| 天天通天天透天天插| 一本久久精品一区二区| 国产使劲操在线播放| 成人国产激情自拍三区| 亚洲国产成人av在线一区| 女人精品内射国产99| 91人妻精品久久久久久久网站| 亚洲自拍偷拍综合色| 97精品视频在线观看| 日日操综合成人av| 2021最新热播中文字幕| 午夜的视频在线观看| 黄色三级网站免费下载| 偷拍3456eee| 91久久综合男人天堂| 日本一二三区不卡无| 青青青青青青草国产| 97香蕉碰碰人妻国产樱花| 888欧美视频在线| av老司机亚洲一区二区| 欧美男人大鸡吧插女人视频| 精品久久久久久久久久中文蒉| 亚洲一级av无码一级久久精品| 亚洲av日韩av网站| 成人18禁网站在线播放| 中文字幕综合一区二区| 精品亚洲国产中文自在线| 91she九色精品国产| 红桃av成人在线观看| 粉嫩av蜜乳av蜜臀| 免费人成黄页网站在线观看国产| 男生舔女生逼逼视频| 老司机在线精品福利视频| 国产av欧美精品高潮网站| 亚洲熟妇无码一区二区三区| 日本一道二三区视频久久| 亚洲人妻国产精品综合| 日本一二三中文字幕| 国产伊人免费在线播放| 欧美熟妇一区二区三区仙踪林| 亚洲乱码中文字幕在线| 日韩亚洲高清在线观看| 国产精品久久久久国产三级试频| 人妻av无码专区久久绿巨人| 国产91久久精品一区二区字幕| 2020韩国午夜女主播在线| 少妇露脸深喉口爆吞精| 超污视频在线观看污污污| 国产精品自拍视频大全| 中国无遮挡白丝袜二区精品| 色婷婷久久久久swag精品| 亚洲av日韩av第一区二区三区| 欧美精品亚洲精品日韩在线| 欧美日韩国产一区二区三区三州| 国产女人露脸高潮对白视频| 中文字幕成人日韩欧美| 91www一区二区三区| 粗大的内捧猛烈进出爽大牛汉子| 91综合久久亚洲综合| 亚欧在线视频你懂的| 女生自摸在线观看一区二区三区| 岛国青草视频在线观看| 免费无毒热热热热热热久| 中文字幕在线永久免费播放| 2018在线福利视频| 国产免费av一区二区凹凸四季| 天天躁夜夜躁日日躁a麻豆| 在线成人日韩av电影| 国产V亚洲V天堂无码欠欠 | jiujiure精品视频在线| 中英文字幕av一区| 精品一区二区三四区| 99的爱精品免费视频| 亚洲老熟妇日本老妇| 人人在线视频一区二区| 国产一区自拍黄视频免费观看| 操的小逼流水的文章| 日本av高清免费网站| 91国偷自产一区二区三区精品| gogo国模私拍视频| 天天干天天啪天天舔| 免费黄页网站4188| 99热这里只有国产精品6| 99视频精品全部15| 婷婷综合亚洲爱久久| 亚洲一区二区久久久人妻| 在线免费观看欧美小视频| 社区自拍揄拍尻屁你懂的| 插小穴高清无码中文字幕| 国产性感美女福利视频| 自拍 日韩 欧美激情| 99久久中文字幕一本人| 超级碰碰在线视频免费观看| 亚洲成人激情视频免费观看了| 91高清成人在线视频| 91极品新人『兔兔』精品新作| 狠狠操狠狠操免费视频| 把腿张开让我插进去视频| 在线网站你懂得老司机| 亚洲青青操骚货在线视频| 国产男女视频在线播放| 精品一区二区三区三区88 | 亚洲2021av天堂| 免费69视频在线看| 一区二区免费高清黄色视频| 国内资源最丰富的网站| 中文字幕在线观看极品视频| 国产揄拍高清国内精品对白| 国产视频网站一区二区三区| 亚洲午夜精品小视频| 91中文字幕免费在线观看| 免费费一级特黄真人片| 性感美女诱惑福利视频| 人妻激情图片视频小说| 91天堂精品一区二区| 91精品视频在线观看免费| 欧美中文字幕一区最新网址| 乱亲女秽乱长久久久| 成年女人免费播放视频| 99的爱精品免费视频| 91国产资源在线视频| 亚洲国产在人线放午夜| 在线国产日韩欧美视频| 成熟丰满熟妇高潮xx×xx| 99久久99久国产黄毛片| 五十路老熟女码av| 99久久激情婷婷综合五月天| 精品国产午夜视频一区二区| 精品区一区二区三区四区人妻| 国产日韩欧美美利坚蜜臀懂色| 久久久噜噜噜久久熟女av| 一级黄片久久久久久久久| tube69日本少妇| 欧美日韩国产一区二区三区三州| 中文字幕av男人天堂| 五十路熟女人妻一区二| 天天干天天日天天干天天操| 任你操任你干精品在线视频| 一级A一级a爰片免费免会员| 成年人的在线免费视频| 欧美爆乳肉感大码在线观看| 久久农村老妇乱69系列| 亚洲男人在线天堂网| 亚洲少妇高潮免费观看| 日本黄色三级高清视频| 亚洲变态另类色图天堂网| 国产91嫩草久久成人在线视频| 一区二区三区蜜臀在线| 国产精品手机在线看片| 天天日夜夜干天天操| 国产精品成人xxxx| 免费黄页网站4188| 欧洲精品第一页欧洲精品亚洲| 欧美日韩人妻久久精品高清国产| 国产综合高清在线观看| 亚洲一区二区三区久久受 | 91九色porny国产蝌蚪视频| 欧美一区二区三区乱码在线播放| a v欧美一区=区三区| 欧洲国产成人精品91铁牛tv| 午夜大尺度无码福利视频| 日本女大学生的黄色小视频| 超碰在线中文字幕一区二区| 欧美综合婷婷欧美综合| 国产V亚洲V天堂无码欠欠| 中国熟女@视频91| 99精品一区二区三区的区| 在线免费观看国产精品黄色| sspd152中文字幕在线| 青娱乐蜜桃臀av色| 国产无遮挡裸体免费直播视频| 国产卡一卡二卡三乱码手机| 亚洲精品 日韩电影| 鸡巴操逼一级黄色气| 高清一区二区欧美系列| 亚洲1区2区3区精华液| 中文字幕免费在线免费| 久草视频在线免播放| 1000小视频在线| 天天操天天干天天日狠狠插| 午夜成午夜成年片在线观看| gay gay男男瑟瑟在线网站| 一区二区三区av高清免费| 欧美成人一二三在线网| 午夜影院在线观看视频羞羞羞| 2021最新热播中文字幕| 99re6热在线精品| 午夜国产福利在线观看| 熟女视频一区,二区,三区 | 国产午夜亚洲精品不卡在线观看| 一级A一级a爰片免费免会员| 99av国产精品欲麻豆| 午夜福利资源综合激情午夜福利资| 成人免费做爰高潮视频| 欧美一区二区三区在线资源| 任你操视频免费在线观看| 97精品视频在线观看| 亚洲av日韩精品久久久| 韩国AV无码不卡在线播放| 国产亚洲视频在线二区| 丝袜亚洲另类欧美变态| 美女小视频网站在线| 91老熟女连续高潮对白| 日韩不卡中文在线视频网站| 亚洲av可乐操首页| 桃色视频在线观看一区二区| 亚洲欧美另类手机在线| 99精品久久久久久久91蜜桃| 久久永久免费精品人妻专区| 欧美黄片精彩在线免费观看| 黄色片年轻人在线观看| 精品一区二区三区三区88| 日韩在线视频观看有码在线| 黄片三级三级三级在线观看| 啊啊好大好爽啊啊操我啊啊视频 | 日本少妇人妻xxxxx18| 欧美亚洲偷拍自拍色图| 视频二区在线视频观看| 91试看福利一分钟| 啪啪啪啪啪啪啪啪啪啪黄色| 99精品免费久久久久久久久a| 夜色福利视频在线观看| 亚洲午夜高清在线观看| 国产一级麻豆精品免费| 色婷婷精品大在线观看| 日本韩国免费一区二区三区视频| 欧美成人小视频在线免费看| 精品91高清在线观看| 欧美精品中文字幕久久二区| 亚洲国产成人无码麻豆艾秋| v888av在线观看视频| 免费观看丰满少妇做受| 天天干天天操天天扣| 超碰97人人澡人人| 欧美国产亚洲中英文字幕| 亚洲综合在线观看免费| 9l人妻人人爽人人爽| 岳太深了紧紧的中文字幕| 亚洲欧美久久久久久久久| 日韩精品一区二区三区在线播放| 99精品亚洲av无码国产另类 | 婷婷午夜国产精品久久久| 午夜久久香蕉电影网| av一本二本在线观看| 成人乱码一区二区三区av| 午夜精品在线视频一区| 亚洲精品国偷自产在线观看蜜桃| 欧美在线偷拍视频免费看| 人妻自拍视频中国大陆| 男人天堂最新地址av| 精品91自产拍在线观看一区| 亚洲免费福利一区二区三区| 18禁网站一区二区三区四区| 老熟妇xxxhd老熟女| 黄片色呦呦视频免费看| aⅴ五十路av熟女中出| 北条麻妃肉色丝袜视频| 亚洲中文字幕人妻一区| 97a片免费在线观看| 一区二区视频在线观看免费观看 | 精品一线二线三线日本| 日韩欧美一级精品在线观看| 综合页自拍视频在线播放| 最新的中文字幕 亚洲| 男人天堂色男人av| 一区二区三区美女毛片| 国产成人无码精品久久久电影| 天天干天天日天天谢综合156| av在线免费资源站| 亚洲少妇人妻无码精品| 亚洲欧美另类自拍偷拍色图| av视屏免费在线播放| 国产日韩精品一二三区久久久| 麻豆性色视频在线观看| 免费在线黄色观看网站| 色哟哟在线网站入口| 久久久久久久久久一区二区三区 | 国产精品久久久久久久精品视频| 国产午夜男女爽爽爽爽爽视频| 天天干天天操天天爽天天摸| 亚洲人人妻一区二区三区| 国产大学生援交正在播放| 中文字幕在线永久免费播放| 亚洲人妻av毛片在线| 最新中文字幕免费视频| 在线观看视频 你懂的| 偷拍美女一区二区三区| 国产视频精品资源网站| 色吉吉影音天天干天天操 | 色综合久久久久久久久中文| 中文字幕在线乱码一区二区| 亚洲午夜精品小视频| 把腿张开让我插进去视频| 久久热久久视频在线观看| av一本二本在线观看| 久久www免费人成一看片| 日韩成人免费电影二区| 免费在线看的黄网站| 91中文字幕最新合集| 中字幕人妻熟女人妻a62v网| 久久久久久久一区二区三| 激情啪啪啪啪一区二区三区 | 专门看国产熟妇的网站| 国产又粗又黄又硬又爽| 亚洲1069综合男同| 97黄网站在线观看| 老司机欧美视频在线看| 午夜频道成人在线91| 国产精品自偷自拍啪啪啪| 黄页网视频在线免费观看 | 无码中文字幕波多野不卡| 精品国产污污免费网站入口自| 69精品视频一区二区在线观看| 日韩av有码一区二区三区4| 天天日天天鲁天天操| 91精品激情五月婷婷在线| 国产美女一区在线观看| 黑人借宿ntr人妻的沦陷2| 99热这里只有国产精品6| 成人蜜桃美臀九一一区二区三区| 在线免费观看亚洲精品电影| 久久午夜夜伦痒痒想咳嗽P| 超碰中文字幕免费观看| 亚洲av无码成人精品区辽| 中文字幕人妻被公上司喝醉在线| 国产又大又黄免费观看| 视频一区二区在线免费播放| 蜜桃专区一区二区在线观看| 亚洲av午夜免费观看| 国产成人自拍视频播放| 真实国模和老外性视频| 欧美亚洲偷拍自拍色图| 午夜精品一区二区三区福利视频| 亚洲精品av在线观看| 免费观看污视频网站| 欧美日韩国产一区二区三区三州| 91片黄在线观看喷潮| 一区二区在线观看少妇| av新中文天堂在线网址| av中文字幕网址在线| 五月天久久激情视频| 欧美成人精品欧美一级黄色| 久草视频在线免播放| 熟妇一区二区三区高清版| 国产av福利网址大全| 非洲黑人一级特黄片| 精品美女福利在线观看| 日本少妇精品免费视频| 成人午夜电影在线观看 久久| 极品粉嫩小泬白浆20p主播| 亚洲av色图18p| 丝袜肉丝一区二区三区四区在线 | 亚洲av自拍偷拍综合| 日本女人一级免费片| 很黄很污很色的午夜网站在线观看| 久久久精品国产亚洲AV一| 欧美一区二区三区在线资源| 久久麻豆亚洲精品av| aaa久久久久久久久| 偷偷玩弄新婚人妻h视频| 久久三久久三久久三久久| 黑人乱偷人妻中文字幕| 毛片一级完整版免费| 国产卡一卡二卡三乱码手机| 久久久久久9999久久久久| 国产精品久久久久久久久福交| AV无码一区二区三区不卡| 在线观看av观看av| 日本少妇的秘密免费视频| 深夜男人福利在线观看| 熟妇一区二区三区高清版| 自拍偷拍亚洲精品第2页| 精品91高清在线观看| 国产亚洲欧美45p| 亚洲 自拍 色综合图| 国产精品自偷自拍啪啪啪| 亚洲天堂av最新网址| 水蜜桃国产一区二区三区| 不戴胸罩引我诱的隔壁的人妻| 欧美80老妇人性视频| 免费看国产又粗又猛又爽又黄视频| 国产日韩精品一二三区久久久| 老司机深夜免费福利视频在线观看| 这里有精品成人国产99| 岛国av高清在线成人在线| 亚洲中文字幕国产日韩| 精品区一区二区三区四区人妻| 亚洲欧美自拍另类图片| 亚洲 自拍 色综合图| 男人天堂色男人av| 欧美精品欧美极品欧美视频| av视网站在线观看| 国内资源最丰富的网站| 经典国语激情内射视频| 75国产综合在线视频| 偷拍自拍福利视频在线观看| 亚洲 人妻 激情 中文| 538精品在线观看视频| 三级等保密码要求条款| 一级a看免费观看网站| jiuse91九色视频| 日韩一区二区电国产精品| 中国熟女一区二区性xx| 国产一区二区欧美三区| 免费无码人妻日韩精品一区二区| 国产av自拍偷拍盛宴| 青娱乐最新视频在线| 成年女人免费播放视频| 欧美日韩一级黄片免费观看| 激情小视频国产在线| 国产三级片久久久久久久| 亚洲偷自拍高清视频| 青青青青青青草国产| av在线shipin| 中国视频一区二区三区| 国产一区二区久久久裸臀| 三上悠亚和黑人665番号| 欧美成人精品在线观看| 亚洲欧美激情国产综合久久久| 国产又粗又硬又猛的毛片视频| 少妇高潮无套内谢麻豆| 国产一级精品综合av| 欧美80老妇人性视频| 天天操,天天干,天天射| 久草视频中文字幕在线观看| 91国偷自产一区二区三区精品| 日韩加勒比东京热二区| 男生舔女生逼逼的视频| 9国产精品久久久久老师| 欧美日韩人妻久久精品高清国产| av黄色成人在线观看| 欧美爆乳肉感大码在线观看 | 欧美特级特黄a大片免费| 亚洲一级 片内射视正片| 免费观看丰满少妇做受| 性生活第二下硬不起来| 久久这里只有精品热视频 | 日日夜夜精品一二三| japanese五十路熟女熟妇| 蜜桃色婷婷久久久福利在线| 日日摸夜夜添夜夜添毛片性色av| 绝顶痉挛大潮喷高潮无码| 日韩视频一区二区免费观看| 9国产精品久久久久老师| 女警官打开双腿沦为性奴| 欧美精品中文字幕久久二区| 国产V亚洲V天堂无码欠欠| 亚洲精品乱码久久久本| 最新国产亚洲精品中文在线| 国产janese在线播放| 这里有精品成人国产99| 红桃av成人在线观看| av手机在线免费观看日韩av| 午夜毛片不卡免费观看视频| 黄色的网站在线免费看| 女同互舔一区二区三区| 狍和女人的王色毛片| 1000部国产精品成人观看视频| 中文字幕人妻av在线观看| av日韩在线免费播放| av在线shipin| 人妻最新视频在线免费观看| 五月色婷婷综合开心网4438| 国产视频精品资源网站| 天天射夜夜操狠狠干| 92福利视频午夜1000看 | 亚洲福利精品福利精品福利| 精品亚洲在线免费观看| 一区二区三区久久中文字幕| 成人激情文学网人妻| 天码人妻一区二区三区在线看| 国产污污污污网站在线| 天天日天天干天天要| 亚洲av日韩精品久久久| 亚洲自拍偷拍精品网| 中文字幕日韩精品日本| 国产一区二区三免费视频| 少妇一区二区三区久久久| 国产精品精品精品999| 丝袜长腿第一页在线| 青青尤物在线观看视频网站| 天天干天天操天天插天天日| 亚洲精品无码久久久久不卡| 天天干天天操天天玩天天射 | 欧美另类重口味极品在线观看| 干逼又爽又黄又免费的视频| 日韩熟女av天堂系列| 天天日夜夜操天天摸| 日本少妇人妻xxxxx18| 偷拍自拍亚洲美腿丝袜| 日本啪啪啪啪啪啪啪| 中文亚洲欧美日韩无线码| 青青青爽视频在线播放| 亚洲卡1卡2卡三卡四老狼| 天天日天天干天天要| 九色porny九色9l自拍视频| 久久久久久97三级| 亚洲一区制服丝袜美腿| 中文亚洲欧美日韩无线码| 免费在线黄色观看网站| 一区二区三区综合视频| 中文字幕日韩人妻在线三区| 在线观看av观看av| 91欧美在线免费观看| 中文字幕日韩精品就在这里| caoporn蜜桃视频| 真实国模和老外性视频| 在线视频自拍第三页| 91人妻人人做人人爽在线| 开心 色 六月 婷婷| 免费观看丰满少妇做受| 欧美精品一区二区三区xxxx| 97国产福利小视频合集| 天天综合天天综合天天网| 97人人模人人爽人人喊| 亚洲成人免费看电影| 黄色片一级美女黄色片| 瑟瑟视频在线观看免费视频| 2019av在线视频| 大鸡吧插逼逼视频免费看| 天堂av在线最新版在线| 男女之间激情网午夜在线| 成人av久久精品一区二区| 91片黄在线观看喷潮| 黄色视频成年人免费观看| 19一区二区三区在线播放| 操操网操操伊剧情片中文字幕网| 亚洲2021av天堂| 日本男女操逼视频免费看| 日韩精品一区二区三区在线播放| 成人伊人精品色xxxx视频| 中国老熟女偷拍第一页| 国产成人无码精品久久久电影| av天堂中文字幕最新| 亚洲人妻国产精品综合| 青青在线视频性感少妇和隔壁黑丝 | 视频啪啪啪免费观看| 93精品视频在线观看 | 黄色片黄色片wyaa| 天码人妻一区二区三区在线看| 视频啪啪啪免费观看| 国产chinesehd精品麻豆| 久久久久久九九99精品| 国际av大片在线免费观看| 综合页自拍视频在线播放| 天堂av在线播放免费| 国产精品国产三级国产精东| 欧美精品免费aaaaaa| 东京热男人的av天堂| 亚洲欧美国产麻豆综合| 99久久中文字幕一本人| 日本一本午夜在线播放| 中文字幕人妻av在线观看| 天堂v男人视频在线观看| 中文字日产幕乱六区蜜桃| 男女啪啪视频免费在线观看| 午夜的视频在线观看| 免费无码人妻日韩精品一区二区| 一区二区三区久久中文字幕| 国产精品视频一区在线播放| 国产黄色高清资源在线免费观看| 插小穴高清无码中文字幕| 亚洲国产精品黑丝美女| av天堂中文免费在线| 久久热久久视频在线观看| 男女啪啪啪啪啪的网站| 青草久久视频在线观看| 免费无码人妻日韩精品一区二区 | 亚洲综合另类欧美久久| 91老师蜜桃臀大屁股| 欧美日韩熟女一区二区三区| 日本一道二三区视频久久| 免费看高清av的网站| 国产视频在线视频播放| 搡老妇人老女人老熟女| 亚洲免费在线视频网站| 亚洲精品精品国产综合| av高潮迭起在线观看| 免费成人va在线观看| 夏目彩春在线中文字幕| 日本性感美女写真视频| 天天综合天天综合天天网| 在线免费观看视频一二区| 色婷婷久久久久swag精品| 18禁美女羞羞免费网站| 18禁免费av网站| 日日操夜夜撸天天干| 黄色资源视频网站日韩| 欧美日本国产自视大全| 中文字幕在线观看国产片| 51国产成人精品视频| 久久永久免费精品人妻专区| 人妻丝袜榨强中文字幕| 精品视频国产在线观看| 日本av熟女在线视频| 国产中文字幕四区在线观看| 中文字幕在线第一页成人| 91精品国产麻豆国产| 国际av大片在线免费观看| 99精品国产自在现线观看| 日本18禁久久久久久| AV无码一区二区三区不卡| 女同性ⅹxx女同hd| 97年大学生大白天操逼| 欧美黑人性暴力猛交喷水| 中字幕人妻熟女人妻a62v网| 免费在线福利小视频| 女生被男生插的视频网站| 日本最新一二三区不卡在线| 亚洲变态另类色图天堂网| 38av一区二区三区| 亚洲欧美另类手机在线| 天天日天天干天天要| 91极品新人『兔兔』精品新作| 国产黄色高清资源在线免费观看| av破解版在线观看| 晚上一个人看操B片| 日韩成人性色生活片| 久草极品美女视频在线观看| 后入美女人妻高清在线| 国产自拍黄片在线观看| 好吊操视频这里只有精品| 成人蜜桃美臀九一一区二区三区| avjpm亚洲伊人久久| 日本高清成人一区二区三区| 久久热久久视频在线观看| 亚洲精品精品国产综合| 欧美精品资源在线观看| 青娱乐在线免费视频盛宴| 国产福利在线视频一区| av手机在线观播放网站| 国产aⅴ一线在线观看| 中文字幕av一区在线观看| 丁香花免费在线观看中文字幕| 初美沙希中文字幕在线| 激情内射在线免费观看| 超级福利视频在线观看| 精品国产在线手机在线| 黄色资源视频网站日韩| 亚洲激情偷拍一区二区| 天天干天天操天天扣| 色秀欧美视频第一页| 久久精品视频一区二区三区四区| 青草青永久在线视频18| 日本韩国免费福利精品| 黄色中文字幕在线播放| 久久久人妻一区二区| 性感美女福利视频网站| 亚洲一区二区久久久人妻| 欧美精品国产综合久久| 91国内精品自线在拍白富美| 亚洲成人av一区久久| 日韩欧美国产精品91| 区一区二区三国产中文字幕| 美日韩在线视频免费看| 日本高清撒尿pissing| 日韩激情文学在线视频| 亚洲视频在线观看高清| 天天日夜夜干天天操| 亚洲国产成人无码麻豆艾秋| 动漫精品视频在线观看| 国产真实灌醉下药美女av福利| 中文字幕午夜免费福利视频| 999九九久久久精品| 又黄又刺激的午夜小视频| 亚洲欧美另类手机在线| 日韩av大胆在线观看| 欧美精品中文字幕久久二区| 精品91自产拍在线观看一区| 人妻少妇亚洲一区二区| 欧美aa一级一区三区四区| 国际av大片在线免费观看| 亚洲福利午夜久久久精品电影网| 午夜国产免费福利av| 端庄人妻堕落挣扎沉沦| 亚洲一区二区三区精品视频在线| 亚洲推理片免费看网站| 欧美日韩激情啪啪啪| 一区二区三区欧美日韩高清播放| 中文字幕av一区在线观看| 欧美3p在线观看一区二区三区| 三上悠亚和黑人665番号| 99热色原网这里只有精品| 青青草视频手机免费在线观看| 日韩精品啪啪视频一道免费| 人人妻人人爽人人添夜| 亚洲一区av中文字幕在线观看| 黄网十四区丁香社区激情五月天 | 色吉吉影音天天干天天操| 日韩欧美一级aa大片| 国产女人叫床高潮大片视频| 天天干天天插天天谢| 成人av亚洲一区二区| 国产精品黄色的av| 国产精品自拍在线视频| 久久这里有免费精品| 亚洲无码一区在线影院| 日韩欧美高清免费在线 | 女同互舔一区二区三区| 黑人3p华裔熟女普通话| 国产中文精品在线观看| 75国产综合在线视频| 精品一区二区三四区| 亚洲熟女综合色一区二区三区四区| 一区二区视频在线观看免费观看 | 成人综合亚洲欧美一区 | 日本少妇精品免费视频| av在线免费观看亚洲天堂| 天天插天天狠天天操| 亚洲国产欧美一区二区丝袜黑人| 久精品人妻一区二区三区 | 91麻豆精品91久久久久同性| 午夜av一区二区三区| aⅴ五十路av熟女中出| 97精品综合久久在线| 爆乳骚货内射骚货内射在线| 午夜场射精嗯嗯啊啊视频| 午夜福利资源综合激情午夜福利资 | 亚洲2021av天堂| 成年人的在线免费视频| 熟女人妻一区二区精品视频| 同居了嫂子在线播高清中文| 在线免费观看黄页视频| 国产亚洲四十路五十路| 老司机福利精品视频在线| 久久综合老鸭窝色综合久久 | 亚洲 中文字幕在线 日韩| 亚洲熟女女同志女同| 在线观看的a站 最新| 开心 色 六月 婷婷| 成熟丰满熟妇高潮xx×xx| 九色精品视频在线播放| 国产亚洲四十路五十路| 亚洲午夜高清在线观看| 岛国青草视频在线观看| 老司机福利精品免费视频一区二区 | 伊人综合免费在线视频| 岳太深了紧紧的中文字幕| 人妻少妇av在线观看| 亚洲精品av在线观看| 岳太深了紧紧的中文字幕| 欧美乱妇无乱码一区二区| av新中文天堂在线网址| 蜜桃专区一区二区在线观看| 欧美一区二区中文字幕电影| 特一级特级黄色网片| 日韩精品中文字幕播放| 亚洲欧美激情人妻偷拍| 青青青青草手机在线视频免费看 | 天天日天天爽天天爽| 超碰97人人做人人爱| 日本福利午夜电影在线观看| 青青草视频手机免费在线观看| 黄色视频在线观看高清无码 | 国产精品久久久久网| gay gay男男瑟瑟在线网站| 亚洲激情,偷拍视频| 一区二区三区久久中文字幕| 日韩伦理短片在线观看| 国产黄色a级三级三级三级| 九一传媒制片厂视频在线免费观看| 国产va在线观看精品| 亚洲美女自偷自拍11页| 精品成人啪啪18免费蜜臀| 人妻丝袜诱惑我操她视频| 亚洲成人免费看电影| 国产又色又刺激在线视频| 99国产精品窥熟女精品| www日韩毛片av| 91社福利《在线观看| 最近中文字幕国产在线| 福利视频一区二区三区筱慧 | 日本一区精品视频在线观看| 久久精品美女免费视频| 女生被男生插的视频网站| 777奇米久久精品一区| 国产麻豆精品人妻av| 国产女人被做到高潮免费视频| 亚洲一区二区三区精品乱码| 免费男阳茎伸入女阳道视频 | 天天日天天鲁天天操| 人妻无码中文字幕专区| 国产综合视频在线看片| 日日夜夜大香蕉伊人| 亚洲欧美另类手机在线| 无套猛戳丰满少妇人妻| 午夜久久久久久久99| 100%美女蜜桃视频| 2022中文字幕在线| 男人的网址你懂的亚洲欧洲av| 久久国产精品精品美女| 欧美黑人性猛交xxxxⅹooo| 2021最新热播中文字幕| 99久久超碰人妻国产| 欧美精品久久久久久影院| 天堂av狠狠操蜜桃| 久久h视频在线观看| 福利在线视频网址导航| 国产又粗又黄又硬又爽| av日韩在线免费播放| 偷拍自拍视频图片免费| 午夜福利资源综合激情午夜福利资| 无码中文字幕波多野不卡| 精品亚洲国产中文自在线| 88成人免费av网站| 人妻无码中文字幕专区| 亚洲av无女神免非久久| 99久久成人日韩欧美精品| 欧美地区一二三专区| 亚洲熟女综合色一区二区三区四区| 91精品国产高清自在线看香蕉网| av一本二本在线观看| 精品91自产拍在线观看一区| 激情人妻校园春色亚洲欧美| 91国产在线免费播放| 六月婷婷激情一区二区三区| 亚洲高清国产自产av| 在线观看国产免费麻豆| 熟妇一区二区三区高清版| 亚洲另类综合一区小说| 97黄网站在线观看| 午夜精品亚洲精品五月色| 任我爽精品视频在线播放| 丝袜美腿视频诱惑亚洲无| 夜夜操,天天操,狠狠操| 欧美一级色视频美日韩| 视频在线亚洲一区二区| 激情五月婷婷综合色啪| 欧美第一页在线免费观看视频| 欧美日本aⅴ免费视频| 亚洲中文字幕综合小综合| 久碰精品少妇中文字幕av | 91av中文视频在线| 天天日天天爽天天干| sspd152中文字幕在线| 99久久成人日韩欧美精品| 18禁精品网站久久| 狠狠操操操操操操操操操| 在线亚洲天堂色播av电影| 好太好爽好想要免费| 中文字幕av第1页中文字幕| 国产日韩欧美美利坚蜜臀懂色| 亚洲 自拍 色综合图| 亚洲国产成人av在线一区| 亚洲美女高潮喷浆视频| 日韩亚国产欧美三级涩爱| 做爰视频毛片下载蜜桃视频1| 视频在线亚洲一区二区| av天堂中文免费在线| 成人蜜桃美臀九一一区二区三区| 国产片免费观看在线观看| 欧美成人黄片一区二区三区| 免费观看理论片完整版| 美日韩在线视频免费看| 欧美视频综合第一页| 97a片免费在线观看| 精品黑人一区二区三区久久国产| 最新97国产在线视频| 天天色天天操天天舔| 亚洲av色图18p| 毛片一级完整版免费| 日韩不卡中文在线视频网站 | 真实国模和老外性视频| 嫩草aⅴ一区二区三区| 色偷偷伊人大杳蕉综合网| 欧美成一区二区三区四区| 亚洲乱码中文字幕在线| 天天操天天干天天插| 中文字幕成人日韩欧美| 亚洲无码一区在线影院| 三级等保密码要求条款| 99热国产精品666| 免费黄高清无码国产| 午夜久久香蕉电影网| 欲满人妻中文字幕在线| 亚洲午夜高清在线观看| 国产精品成久久久久三级蜜臀av| 国产亚洲欧美视频网站| 沈阳熟妇28厘米大战黑人| 在线观看操大逼视频| 亚洲欧美国产麻豆综合| 熟女人妻一区二区精品视频| 老司机福利精品免费视频一区二区 | 动漫av网站18禁| 小泽玛利亚视频在线观看| 57pao国产一区二区| 农村胖女人操逼视频| 激情五月婷婷免费视频| 成人精品在线观看视频| 92福利视频午夜1000看| 亚洲蜜臀av一区二区三区九色| 精品一区二区亚洲欧美| 懂色av蜜桃a v| 欧美另类z0z变态| 一区二区三区久久久91| 一区二区三区av高清免费| 成人蜜桃美臀九一一区二区三区| 黄页网视频在线免费观看| 中文字幕中文字幕人妻| 国产精品午夜国产小视频| 国产欧美精品不卡在线| 日本少妇人妻xxxxxhd| 国产日韩精品电影7777| 在线国产精品一区二区三区| 婷婷久久一区二区字幕网址你懂得 | 青草久久视频在线观看| 97人妻夜夜爽二区欧美极品| 亚洲Av无码国产综合色区| 女警官打开双腿沦为性奴| 国产高清在线观看1区2区| 中国老熟女偷拍第一页| 人人妻人人澡人人爽人人dvl| 后入美女人妻高清在线| 91亚洲精品干熟女蜜桃频道 | 亚洲2021av天堂| 成人福利视频免费在线| 亚洲精品欧美日韩在线播放| 国产一线二线三线的区别在哪| 偷拍3456eee| 视频二区在线视频观看| 午夜激情精品福利视频| free性日本少妇| 久草视频在线免播放| 久久久久久久亚洲午夜综合福利 | 特级欧美插插插插插bbbbb| 沈阳熟妇28厘米大战黑人| 亚洲av在线观看尤物| 97精品视频在线观看| av日韩在线免费播放| 日本少妇的秘密免费视频| 在线视频国产欧美日韩| 在线观看亚洲人成免费网址| 福利国产视频在线观看| 日日摸夜夜添夜夜添毛片性色av| 青娱乐蜜桃臀av色| 99精品视频在线观看婷婷| 深田咏美亚洲一区二区| 日本av高清免费网站| 九九热99视频在线观看97| 蜜桃精品久久久一区二区| 亚洲av色香蕉一区二区三区| 日韩北条麻妃一区在线| 视频 一区二区在线观看| 亚洲精品乱码久久久本| 老熟妇xxxhd老熟女| 91免费福利网91麻豆国产精品 | 91免费福利网91麻豆国产精品| 亚洲欧洲av天堂综合| 大鸡吧插逼逼视频免费看| 无码国产精品一区二区高潮久久4| 亚洲成人线上免费视频观看| 亚洲综合图片20p| 啪啪啪啪啪啪啪啪av| 免费无毒热热热热热热久| 老司机午夜精品视频资源| 又粗又硬又猛又爽又黄的| 99精品一区二区三区的区| 日韩av熟妇在线观看| 精品国产污污免费网站入口自| 51精品视频免费在线观看| 国产亚洲精品品视频在线| 天堂av中文在线最新版| 天天日天天添天天爽| 国产一级精品综合av| 国产日韩精品一二三区久久久| 男女啪啪啪啪啪的网站| 色秀欧美视频第一页| 91www一区二区三区| 欧美老妇精品另类不卡片| 人妻少妇一区二区三区蜜桃| 亚洲av无码成人精品区辽| 国产熟妇一区二区三区av| 国产又粗又黄又硬又爽| 中文字幕一区二区三区人妻大片| 91小伙伴中女熟女高潮| 欧美男同性恋69视频| 中文字幕无码日韩专区免费| 成人激情文学网人妻| 精品欧美一区二区vr在线观看| 欧美一级色视频美日韩| 亚洲av日韩av第一区二区三区| 精品一区二区三区在线观看| av一本二本在线观看| 欧美日韩熟女一区二区三区| 国产又粗又黄又硬又爽| 人妻素人精油按摩中出| 在线免费观看日本伦理| 日本韩国免费福利精品| 亚洲va国产va欧美va在线| 中国产一级黄片免费视频播放| 老司机免费福利视频网| 一区二区三区日韩久久| 激情国产小视频在线| 天天干天天操天天玩天天射 | 亚洲超碰97人人做人人爱| 亚洲综合一区成人在线| 大香蕉日本伊人中文在线| 久久丁香婷婷六月天| 99一区二区在线观看| 2020中文字幕在线播放| 熟女91pooyn熟女| 欧美一区二区三区啪啪同性| 清纯美女在线观看国产| 夜鲁夜鲁狠鲁天天在线| 国内精品在线播放第一页| 91色九色porny| 亚洲 欧美 精品 激情 偷拍| 沈阳熟妇28厘米大战黑人| 天天色天天操天天舔| 日韩亚洲高清在线观看| 亚洲在线一区二区欧美| 3344免费偷拍视频| 欧美亚洲自偷自拍 在线| 国产麻豆乱子伦午夜视频观看| 99re国产在线精品| 人妻熟女中文字幕aⅴ在线| 亚洲精品ww久久久久久| 麻豆性色视频在线观看| 亚洲av无码成人精品区辽| 亚洲av第国产精品| 欧美精品免费aaaaaa| 五月天久久激情视频| 动漫精品视频在线观看| 青青草精品在线视频观看| 在线观看亚洲人成免费网址| 黄片色呦呦视频免费看| 日韩欧美国产精品91| gay gay男男瑟瑟在线网站| av成人在线观看一区| 国产欧美精品一区二区高清| 中文字幕乱码人妻电影| 免费观看污视频网站| 亚洲国产第一页在线观看| 18禁无翼鸟成人在线| 大白屁股精品视频国产| 91人妻精品一区二区久久| 91国语爽死我了不卡| 夜色撩人久久7777| 2020韩国午夜女主播在线| av成人在线观看一区| 夜色17s精品人妻熟女| 男人操女人的逼免费视频| 欧美专区日韩专区国产专区| 亚洲成人午夜电影在线观看| 欧美亚洲中文字幕一区二区三区| 国产 在线 免费 精品| 888欧美视频在线| 少妇一区二区三区久久久| 女同互舔一区二区三区| 国产高清精品极品美女| 女生被男生插的视频网站| 黄色三级网站免费下载| 高清一区二区欧美系列| 欧美性受xx黑人性猛交| 亚洲最大黄了色网站| 成人免费毛片aaaa| 欧美80老妇人性视频| 狠狠操狠狠操免费视频| 一区二区三区四区中文| 91九色porny国产蝌蚪视频| 国产刺激激情美女网站| 日本www中文字幕| 一级A一级a爰片免费免会员| 特级欧美插插插插插bbbbb| 在线播放国产黄色av| 人人妻人人爽人人添夜| 中文字幕免费在线免费| 97超碰国语国产97超碰| 久久久久久97三级| 亚洲人成精品久久久久久久| 瑟瑟视频在线观看免费视频| 2022国产精品视频| 福利午夜视频在线合集| 日本av熟女在线视频| 国产欧美精品一区二区高清| 久碰精品少妇中文字幕av| 国产密臀av一区二区三| 无套猛戳丰满少妇人妻| 亚欧在线视频你懂的| 精品国产成人亚洲午夜| 最新97国产在线视频| 中文字幕1卡1区2区3区| 午夜频道成人在线91| 日本成人不卡一区二区| 免费在线黄色观看网站| 91中文字幕免费在线观看| 成人性黑人一级av| 超碰97免费人妻麻豆| 青青青青青青青青青青草青青 | 丰满少妇翘臀后进式| 一二三中文乱码亚洲乱码one| 亚洲欧美精品综合图片小说| 人人妻人人爱人人草| 亚洲熟色妇av日韩熟色妇在线| 中国视频一区二区三区| 大香蕉玖玖一区2区| 天天日天天日天天射天天干| asmr福利视频在线观看| 一区二区三区另类在线 | 亚洲高清免费在线观看视频| 国产九色91在线视频| okirakuhuhu在线观看| 人妻久久无码中文成人| 99国内小视频在现欢看| 亚洲激情偷拍一区二区| 国产污污污污网站在线| 人人妻人人爽人人澡人人精品| 又黄又刺激的午夜小视频| 99re国产在线精品| 欧美亚洲中文字幕一区二区三区| 操日韩美女视频在线免费看| 日韩在线中文字幕色| 国产中文字幕四区在线观看| 激情小视频国产在线| 亚洲精品欧美日韩在线播放| 青青草国内在线视频精选| av久久精品北条麻妃av观看| 91精品国产综合久久久蜜| 丁香花免费在线观看中文字幕| 国产亚洲视频在线观看| aⅴ精产国品一二三产品| 免费看美女脱光衣服的视频| 国产亚洲视频在线观看| 狠狠躁夜夜躁人人爽天天久天啪| 福利一二三在线视频观看| 青青青青青免费视频| 日本最新一二三区不卡在线| 国产精品久久综合久久| 日本三极片中文字幕| xxx日本hd高清| 亚洲av自拍偷拍综合| 97人人模人人爽人人喊| 亚洲天天干 夜夜操| 国产乱子伦一二三区| 阿v天堂2014 一区亚洲| 超pen在线观看视频公开97| av在线观看网址av| 99久久中文字幕一本人| 一区二区三区精品日本| 中文乱理伦片在线观看| 青青草视频手机免费在线观看| 国产 在线 免费 精品| 天天色天天舔天天射天天爽 | 欧美日本国产自视大全| 91免费黄片可看视频| 久久这里有免费精品| 自拍偷区二区三区麻豆| 青青青激情在线观看视频| 无码日韩人妻精品久久| 国产精品视频欧美一区二区| 青青色国产视频在线| 亚洲精品久久视频婷婷| 偷拍3456eee| 欧美在线偷拍视频免费看| 水蜜桃国产一区二区三区| 亚洲精品麻豆免费在线观看| 大香蕉福利在线观看| 国产一级精品综合av| 人人妻人人爱人人草| 国产成人精品福利短视频| 五月精品丁香久久久久福利社| 在线免费观看黄页视频| 男人天堂色男人av| 青青青青草手机在线视频免费看 | 国产九色91在线视频| 成年人午夜黄片视频资源| 天天摸天天亲天天舔天天操天天爽| 成人H精品动漫在线无码播放| 亚洲中文精品字幕在线观看| 天天操天天干天天艹| av黄色成人在线观看| 91中文字幕最新合集| 一区二区三区日本伦理| 日韩影片一区二区三区不卡免费| 亚洲成人av一区久久| 丰满的继坶3中文在线观看| 亚洲 中文 自拍 另类 欧美| 特级欧美插插插插插bbbbb| 久久三久久三久久三久久| 午夜久久久久久久99| 国产精品人妻一区二区三区网站| 蜜臀成人av在线播放| 欧美精品国产综合久久| 日韩中文字幕福利av| 国产又大又黄免费观看| 欧美在线偷拍视频免费看| 中文字母永久播放1区2区3区| 久久丁香花五月天色婷婷| 国产精品视频一区在线播放| 99热国产精品666| 爱有来生高清在线中文字幕| 粉嫩av蜜乳av蜜臀| 中文字幕日本人妻中出| 18禁精品网站久久| 操人妻嗷嗷叫视频一区二区| 久久精品亚洲成在人线a| 中文字幕在线第一页成人| 黄色男人的天堂视频| 国产精品久久综合久久| 日韩av有码中文字幕| 成年人黄色片免费网站| 亚洲一级av大片免费观看| 蜜桃色婷婷久久久福利在线| 日本熟妇喷水xxx| 91中文字幕免费在线观看| 亚洲av无码成人精品区辽| 国产美女精品福利在线| 女警官打开双腿沦为性奴| 亚洲综合一区成人在线| 午夜大尺度无码福利视频| 青青青视频自偷自拍38碰| 欧美偷拍亚洲一区二区| 国产福利小视频免费观看| 天天操天天干天天日狠狠插| 亚洲av可乐操首页| 亚洲超碰97人人做人人爱| 国产一区二区欧美三区| 亚洲精品 日韩电影| 78色精品一区二区三区| 婷婷综合蜜桃av在线| 2020久久躁狠狠躁夜夜躁| 农村胖女人操逼视频| 蜜桃视频17c在线一区二区| 亚洲中文精品字幕在线观看| 亚洲av自拍偷拍综合| 国产夫妻视频在线观看免费| 自拍偷拍日韩欧美亚洲| 亚洲1卡2卡三卡4卡在线观看| 欧美老鸡巴日小嫩逼| 韩国三级aaaaa高清视频| 天天干天天爱天天色| 亚洲欧美另类手机在线| 久久久久久久一区二区三| 黄工厂精品视频在线观看| 亚洲精品麻豆免费在线观看| 99热99re在线播放| 久草极品美女视频在线观看| 欧美日韩情色在线观看| weyvv5国产成人精品的视频| 精品人妻伦一二三区久 | 888欧美视频在线| 欧美xxx成人在线| 国产精品黄色的av| 亚洲最大黄 嗯色 操 啊| 婷婷久久久久深爱网| 国产亚洲国产av网站在线| 欧美va亚洲va天堂va| 日本美女性生活一级片| 可以免费看的www视频你懂的| 成人av中文字幕一区| 操操网操操伊剧情片中文字幕网 | 综合色区亚洲熟妇shxstz| 欧美中文字幕一区最新网址| 免费观看成年人视频在线观看| 亚洲无码一区在线影院| 亚洲欧美成人综合在线观看| av成人在线观看一区| 亚洲天堂av最新网址| 夜夜嗨av一区二区三区中文字幕| 这里只有精品双飞在线播放| 免费黄色成人午夜在线网站| av日韩在线观看大全| 欧美一区二区三区高清不卡tv| 动漫av网站18禁| 中文字幕在线欧美精品| wwwxxx一级黄色片| 亚洲欧美国产麻豆综合| 亚洲色偷偷综合亚洲AV伊人| 亚洲天堂成人在线观看视频网站| 国产激情av网站在线观看| 亚洲va天堂va国产va久| 在线免费观看靠比视频的网站| 久久永久免费精品人妻专区| 色狠狠av线不卡香蕉一区二区| 99热国产精品666|