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

深入了解Messenger的實現細節

移動開發 Android
Android 上實現 IPC (進程間通訊)的方式有好幾種,其中有一種就是使用 AIDL 方式實現。對于使用 AIDL 方式通訊,其關鍵就在于創建 aidl 文件,系統會自動為 aidl 文件生成相應的 Java 類,其關鍵實現在于生成的 Java 類中。

近一個半月因為工作變動的緣故,忙著交接工作和復習面試。沒有多少時間來寫博客,連一周三次的健身都有幾個星期沒練了,好多同事問我是胖了還是壯了(我迅速就岔開話題了,機智boy)。上周離職,這周主要在處理一些私事、做些入職準備工作、看點書之類的,下周入職YY(上周才知道原來大神羅升陽也在YY)。好啦,說了這么多,要開始進入 Messenger 的正題了。

前言

看這篇文章前,需要對 Android 的進程間通訊方式有所了解,不然可能會云里霧里。

從使用 Messenger 說起

Android 上實現 IPC (進程間通訊)的方式有好幾種,其中有一種就是使用 AIDL 方式實現,對使用 AIDL 不了解的童鞋可以看下方的官方文檔(需要梯子)。

https://developer.android.com...

對于使用 AIDL 方式通訊,其關鍵就在于創建 aidl 文件,系統會自動為 aidl 文件生成相應的 Java 類,其關鍵實現在于生成的 Java 類中。

系統提供了一個更方便我們進行 IPC 的類 —— Messenger,先來看看如何使用 Messenger(熟悉的童鞋完全可以跳過這一部分)。

  • 第一步:客戶端進程創建兩個 Messenger,一個 Sender ,一個 Receiver;
  1. //客戶端進程發消息給服務進程 
  2.    private Messenger mSender; 
  3.    //客戶端進程接收服務進程回調 
  4.    private Messenger mReceiver = new Messenger(new Handler() { 
  5.        @Override 
  6.        public void handleMessage(Message msg) { 
  7.            super.handleMessage(msg); 
  8.            Bundle data = msg.getData(); 
  9.            if (data != null) { 
  10.                String response = data.getString("body"); 
  11.                Toast.makeText(MainActivity.this, response, Toast.LENGTH_SHORT).show(); 
  12.            } 
  13.        } 
  14.    });  
  • 第二步:編寫Service類,并需要在 AndroidManifest.xml 配置多進程;
  1. public class IPCService extends Service { 
  2.  
  3.     private Messenger messenger = new Messenger(new Handler() { 
  4.         @Override 
  5.         public void handleMessage(Message msg) { 
  6.             super.handleMessage(msg); 
  7.             try { 
  8.                 Thread.sleep(2 * 1000); 
  9.             } catch (InterruptedException e) { 
  10.                 e.printStackTrace(); 
  11.             } 
  12.             Message response = Message.obtain(); 
  13.             Bundle data = new Bundle(); 
  14.             data.putString("body""response"); 
  15.             response.setData(data); 
  16.             try { 
  17.                 msg.replyTo.send(response);//回調客戶端 
  18.             } catch (RemoteException e) { 
  19.                 e.printStackTrace(); 
  20.             } 
  21.         } 
  22.     }); 
  23.  
  24.     @Override 
  25.     public IBinder onBind(Intent intent) { 
  26.         return messenger.getBinder();//將Binder返回給請求綁定的進程 
  27.     } 
  28.  
  29.  
  • 第三步:綁定Service進程,并在 ServiceConnection 中初始化 Sender;
  1. Intent intent = new Intent(this, IPCService.class); 
  2.     startService(intent); 
  3.     bindService(intent, conn, Context.BIND_AUTO_CREATE);//啟動綁定Service進程 
  4.  
  5.     private ServiceConnection conn = new ServiceConnection() { 
  6.         @Override 
  7.         public void onServiceConnected(ComponentName name, IBinder service) { 
  8.             mSender = new Messenger(service); //用Binder初始化Sender 
  9.         } 
  10.  
  11.         @Override 
  12.         public void onServiceDisconnected(ComponentName name) { 
  13.  
  14.         } 
  15.     };  
  • 第四步:用 Sender 和 Receiver 完成客戶端進程和服務進程的交互。
  1. if (mSender != null) { 
  2.         Message message = Message.obtain(); 
  3.         message.replyTo = mReceiver;//將 Receiver 一并發送給服務進程 
  4.         try { 
  5.              mSender.send(message); 
  6.         } catch (RemoteException e) { 
  7.              e.printStackTrace(); 
  8.         } 
  9.      }  

至此,在綁定服務進程初始化 Sender 后,即可以做多進程間的交互工作了。使用 Messenger 來實現多進程的交互相比我們用 aidl 來要方便得多,但是 Messenger 的內部也是采用 aidl 實現的,只不過為了方便開發者調用而進行一些封裝,使得開發者們可以忽略 aidl 的實現細節。簡單的了解了 Messenger 的基本使用后,下面我們就來看看 Messenger 的源代碼,了解一些內部的實現細節。

  • Messenger 源代碼通讀

Messenger 類位于 android.os 包下,代碼量不是很多,所以看起來難度不大,只有如下這么幾個方法。

在上面的示例代碼中可以看到,客戶端進程有 Sender 和 Receiver 兩個 Messenger,如果不需要實現服務進程回調客戶端進程,那么 Receiver 完全可以不要。當需要服務進程回調客戶端進程時,則需要傳入 Receiver 了。由于需要在進程間傳遞 Messenger 對象,那么 Messenger 類就必須要繼承 Serializable 或者 Parcelable 接口。按照 Android 系統一向的風格,都是偏向于推薦繼承 Parcelable 來實現。

所以,上面看到的 describeContents、writeToParcel 方法和 CREATOR 對象實際上繼承 Parcelable 的實現。不明白的童鞋可以參照 Parcelable 的官方文檔(需要梯子)

https://developer.android.com...

而 equals 和 hashCode 方法自然不用多說啦,大家熟悉得很。而 writeMessengerOrNullToParcel 和 readMessengerOrNullFromParcel 這對靜態方法主要是實現 Messenger 在 Parcel 中的讀寫操作的,實現比較簡單,大家參見下面代碼就可以理解了。

當然,Messenger 除了繼承 Parcelable 外,還需要聲明一個同名的 Messenger.aidl 文件,可以在 framework 層源碼下 android.os 包中找到 Messenger.aidl 文件,對于寫過 aidl 的童鞋,肯定不陌生了。

排除掉上面提到的方法,剩下的主要是 Messenger 的兩個構造方法以及 getBinder 和 send 方法。客戶端調用服務進程方法時,是通過 Messenger 中的 send 方法,所以我們先直接看 send 方法中的內部實現

其內部是調用了 mTarget 的 send 方法,那么 mTarget 又是何物呢?

 從上面可以看到 mTarget 是一個 IMessenger 實例,作為 Messenger 唯一的成員變量。 初始化 mTarget 是在 public Messenger(Handler target) 構造函數中,利用 Handler 的 getIMessenger 方法來獲取一個 IMessenger 的實例。

從上圖可以看到 getIMessenger 前面是沒有修飾符的,這樣控制了該方法的作用域僅限于 android.os 包內給其他類使用,我們日常開發是無法使用該方法的,所以在 API 文檔中也沒有提供相應接口文檔。在倒數第二行中可以看到 new MessengerImpl() 并在最后 return 給調用者。所以實際上, mTarget 具體實現是在 MessengerImpl 中。

MessengerImpl 實際上是 Handler 的一個私有內部類,它繼承了 IMessenger.Stub 并實現 send 方法。用過 aidl 的童鞋 IMessenger.Stub 的身影想必就明白了,實際上 IMessenger 就是系統提供的 IMessenger.aidl 文件,而 IMessenger.Stub 就是由 IMessenger.aidl 生成的類。 IMessenger.aidl 在 framework 層代碼的 android.os 包中可以找到,而關于 IMessenger 的 Java 實現,則可以看下面的鏈接。

http://grepcode.com/file/repo...

MessengerImpl 的 send 實現相對也比較簡單,只有兩行代碼

  1. public void send(Message msg) { 
  2.        msg.sendingUid = Binder.getCallingUid(); 
  3.        Handler.this.sendMessage(msg); 
  4.    }  

首先是將發起調用的客戶端進程的 Linux Uid 存儲在我們傳入的 Message 對象中,服務進程收到 Message 可以通過 msg.sendingUid 得知發起調用的進程的 Linux Uid。接著通過 Handler 的 sendMessage 方法發送給服務進程,這意味著 Messenger 與服務進程間的操作是串行的,因此,在有并行需求的場景下 Messenger 就不適用了。

了解完了 send 方法后,最后就只剩下 getBinder 了,其內部實現也簡單。

 參照前面的示例代碼,這里主要還是在 Service 的 onBind 方法中返回 Binder 對象給客戶端調用,實現同樣是 IMessenger 的 Java 實現中。

至此,基本上看完了整個 Messenger 的內部代碼,從上面的分析上看,內部實現確實非常簡單,基于 aidl 的基礎上做的封裝實現,又對開發者屏蔽了底層 aidl 的實現細節。當然個人認為有兩點不足之處:

  • 一個前面提到的 send 操作串行,并行場景則無法用 Messenger;
  • Messenger 內部沒有做 Binder 鍵斷裂重連的處理(個人認為內部處理了會更好,更加屏蔽底層的實現細節);

遠程調用的阻塞與非阻塞

Android 系統跨進程通訊的底層實現都是通過 Binder 實現,正常情況下客戶端進程發起一個遠程方法調用的流程大致如下:

  • 客戶端線程發起調用;
  • 客戶端線程將遠程調用操作交給 Binder 線程池,并阻塞等待返回遠程方法執行完畢返回;

這也就意味著,我們不能在客戶端進程的 UI 線程中發起遠程方法調用,不然如果遠程方法執行了耗時操作,客戶端的 UI 線程將會被阻塞,從而造成 ANR 的問題存在。讀者可以自行嘗試自定義 aidl 并發起一個耗時的遠程方法調用進行驗證。但是,如果你使用系統提供的 Messenger ,則不會出現這樣的問題,無論你的遠程方法執行多么耗時,客戶端 Messenger 發起調用后會繼續執行接下來的代碼,并不會進行阻塞等待。這里讓我百思不得其解,為什么呢?前面我們可以看到 Messenger 的 send 方法實現是在 MessengerImpl 中

并且,發送 Messeage 的操作是利用主線程的 Handler ,并沒有其他的異步操作,為何執行的過程中不阻塞?這點我也完全沒有想明白,最后折騰半天無果向任玉剛老師求助才得到答案。原來,默認情況下發起的遠程方法調用都是阻塞式的,但也可以是非阻塞式的。 Messenger 就是采用非阻塞的方式通訊,其關鍵就在于 IMessenger.aidl 的實現

相比平常自定義的 aidl,多了 oneway 的關鍵字,聲明和不聲明 oneway 關鍵字的在于生成 Java 類中一個參數

 

 

不聲明 oneway 時,mRemote.transact 傳入的最后一個參數是 0;聲明 oneway 時,mRemote.transact 傳入的最后一個參數是 android.os.IBinder.FLAG_ONEWAY 。

  

 

查看 API 文檔即可以看到 FLAG_ONEWAY 的作用就是讓客戶端能夠非阻塞的調用遠程方法,至此真相大白,如果我們自定義的 aidl 也想實現非阻塞的調用,只需聲明 oneway 關鍵字即可。

總結

因為平時并不常用到 oneway,加上文檔提及的很少,唯一有描述的就是下面這段。這次看了 Messenger 的代碼才知道有這么回事,也是漲姿勢了。

對我的博文感興趣,可以關注我的簡書喲:

http://www.jianshu.com/users/...

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2020-09-21 05:58:40

深度學習算法目標檢測

2010-11-19 16:22:14

Oracle事務

2020-09-21 09:53:04

FlexCSS開發

2022-08-26 13:48:40

EPUBLinux

2009-08-25 16:27:10

Mscomm控件

2010-07-13 09:36:25

2010-06-23 20:31:54

2020-07-20 06:35:55

BashLinux

2017-06-13 12:40:47

Python字符串對象

2019-08-02 08:59:21

Token認證服務器

2017-01-20 08:30:19

JavaScriptfor循環

2019-11-29 16:21:22

Spring框架集成

2018-02-24 13:21:02

2021-09-03 08:27:47

FortinetSASE平臺安全

2018-09-04 16:20:46

MySQ索引數據結構

2013-04-10 11:16:19

iPad的MouseE

2023-12-01 09:14:58

ReactFiber

2010-11-15 11:40:44

Oracle表空間

2011-07-18 15:08:34

2022-06-03 10:09:32

威脅檢測軟件
點贊
收藏

51CTO技術棧公眾號

国产精品高清在线观看| 日韩av一区在线| 亚洲一区二区三区涩| 一区二区视频免费| 正在播放日韩欧美一页| 日韩三级视频在线观看| 国产欧美精品aaaaaa片| 香蕉视频国产在线| 免费成人你懂的| 久久综合免费视频影院| 亚洲少妇中文字幕| 欧美xxxxxx| 中文字幕亚洲精品在线观看 | www在线观看免费视频| 澳门av一区二区三区| 中文字幕在线一区免费| 丁香婷婷久久久综合精品国产| 久久夜靖品2区| 成人在线免费视频观看| 日韩三级电影网址| 岳毛多又紧做起爽| 免费a级毛片在线播放| 丰满放荡岳乱妇91ww| 国产精品久久久久久久久粉嫩av| 破处女黄色一级片| 久久av免费| 欧美成人欧美edvon| 欧美伦理视频在线观看| 中文在线免费| 国产欧美日韩卡一| 高清一区二区三区视频| 国模私拍一区二区| 亚洲人妖在线| 久久久精品免费| 大黑人交xxx极品hd| 亚洲欧美在线综合| 色综合久久久久久久久| 色一情一乱一乱一区91| 国际av在线| 成人精品免费看| 国产在线精品一区免费香蕉 | 久热国产精品视频| 91网站免费入口| 最新国产一区二区| 欧美日韩一区三区四区| 免费黄色日本网站| 在线你懂的视频| 国产精品久久久久久久久久久免费看 | 三区精品视频观看| 成人午夜免费在线观看| 狠狠色伊人亚洲综合成人| 日本欧美一二三区| 在线观看日韩中文字幕| 在线不卡视频| 欧美大片第1页| 欧美日韩色视频| 手机在线电影一区| 亚洲偷熟乱区亚洲香蕉av| 久草视频福利在线| 91欧美极品| 日韩视频永久免费| 亚洲男人天堂av在线| 欧美大片免费观看网址| 天天色天天操综合| 日韩欧美不卡在线| 国产亚av手机在线观看| 亚洲一区影音先锋| www.国产在线视频| 成人免费高清观看| 亚洲高清不卡在线观看| 久久久久久免费看| 国产拍在线视频| 午夜不卡av免费| 少妇av一区二区三区无码| av资源在线| 精品人伦一区二区三区蜜桃网站| 久在线观看视频| 狼人综合视频| 欧美色视频日本版| 欧美日韩大尺度| 免费高清视频在线一区| 欧美探花视频资源| 粉色视频免费看| 99tv成人影院| 精品少妇一区二区| 亚洲成人日韩在线| 日韩毛片视频| 操日韩av在线电影| 国产网址在线观看| 久久亚洲一区| 国产欧美日韩专区发布| a级片免费观看| 成人激情小说网站| 欧美国产综合视频| 91女主播在线观看| 一区二区三区在线观看欧美| 18黄暴禁片在线观看| 涩涩涩视频在线观看| 在线欧美日韩国产| 无码人妻一区二区三区在线视频| 97成人在线| 亚洲视频第一页| 国产精品成人69xxx免费视频| 欧美人成在线| 国产91对白在线播放| 波多野结衣激情视频| 国产综合色视频| 久久av一区二区| 免费在线看a| 亚洲成人黄色影院| 尤物国产在线观看| 国产精品对白久久久久粗| 亚洲色图激情小说| 九九九在线视频| 日韩在线一区二区三区| 99在线影院| 成人在线观看免费| 亚洲福中文字幕伊人影院| 性chinese极品按摩| 高清欧美性猛交xxxx黑人猛| 在线观看久久久久久| 精品99久久久久成人网站免费| 亚洲一区自拍| 亚洲综合日韩在线| 国产爆初菊在线观看免费视频网站| 亚洲精选视频免费看| 精品www久久久久奶水| 超碰在线一区| 日韩在线视频网| 手机看片久久久| 国产盗摄精品一区二区三区在线 | 国产精品手机在线播放 | 国产又粗又猛又爽视频| 国产伊人精品| 91精品久久久久久久久久久久久| 无码国产伦一区二区三区视频| 日韩美女精品在线| 青青青国产在线视频| 久久精品色综合| 久热精品视频在线| 在线观看日批视频| 国产午夜精品福利| 国产网站免费在线观看| 视频国产精品| 久久久www成人免费精品| 一区二区三区在线观看av| 成人福利视频网站| 精品人妻大屁股白浆无码| 日韩国产一二三区| 一本色道久久综合狠狠躁篇的优点| 色网站在线播放| 成人黄页毛片网站| 久久99久久久久久| 97久久综合精品久久久综合| 欧美精品一区二区三区国产精品| 自拍偷拍精品视频| 久久精品一区蜜桃臀影院| 日韩精品―中文字幕| 国偷自产av一区二区三区| 欧美乱大交xxxxx另类电影| 91久久精品无码一区二区| 国产精品久久三| 亚洲xxxx2d动漫1| 欧美男同视频网| 国产精品99久久久久久人| 免费一级毛片在线观看| 色婷婷av一区二区三区gif | 久久色在线观看| 欧美丰满熟妇bbbbbb百度| 首页亚洲中字| 日本最新高清不卡中文字幕| 清纯唯美亚洲色图| 91精品办公室少妇高潮对白| 性猛交娇小69hd| 日本在线不卡一区| 一区二区视频在线观看| 2020国产精品小视频| 免费av一区二区| www.国产欧美| 亚洲成在人线在线播放| 一级欧美一级日韩片| 久久在线精品| 一区二区在线不卡| 狂野欧美xxxx韩国少妇| 欧美高清在线播放| 日日夜夜精品免费| 色综合久久精品| 少妇视频一区二区| 国产成人综合在线| 国产毛片视频网站| 成人一二三区| 亚洲精品欧美极品| av有码在线观看| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 国产一区二区日韩精品| 国产玉足脚交久久欧美| 国产精品嫩模av在线| 亚洲xxxx18| 欧美激情护士| www.日本久久久久com.| 亚洲美女性生活| 欧美最新大片在线看| 欧美丰满熟妇bbbbbb| 91网址在线看| av噜噜在线观看| 99亚洲一区二区| 一本一道久久久a久久久精品91| 日韩有吗在线观看| 日产精品久久久一区二区福利| 欧美尤物美女在线| 亚洲精品mp4| 91在线观看喷潮| 欧美日韩激情网| 永久免费看片直接| 久久久久高清精品| 国产chinesehd精品露脸| 首页欧美精品中文字幕| 国产成人永久免费视频| 国产欧美高清视频在线| av一本久道久久波多野结衣| 成人啊v在线| 久久久久久久亚洲精品| 日本中文字幕电影在线免费观看| 亚洲国产欧美一区| 国产美女免费视频| 色素色在线综合| 亚洲综合一二三| 亚洲免费av高清| av电影网站在线观看| 成人av在线一区二区三区| 亚洲欧美日韩精品一区| 欧美亚洲自偷自偷| 成人免费性视频| 久久精品国产99久久| 免费日韩av电影| 激情小说一区| 成人av网站观看| av国产精品| 国产精品一区专区欧美日韩| xxxxx性欧美特大| 国语自产在线不卡| 日本资源在线| 欧美成人免费在线视频| 黄色精品免费看| 日韩一区二区三区xxxx| av福利精品| 国产亚洲精品美女| 飘雪影院手机免费高清版在线观看| 精品欧美一区二区久久| av网站在线免费看| 91精品国产综合久久香蕉的特点 | 国产永久av在线| 亚洲精品白浆高清久久久久久| 亚洲精品一区二区三区区别 | 欧美成年人网站| 欧美成人二区| 精品国产一区二区三区久久狼黑人| 国产区av在线| 亚洲性线免费观看视频成熟| 暖暖视频在线免费观看| 亚洲欧美日韩在线一区| 裸体xxxx视频在线| 亚洲人成网站999久久久综合| 日韩电影免费| 亚洲性生活视频在线观看| 国产福利小视频在线| 在线精品91av| 日本在线免费看| 久久精品亚洲94久久精品| 国产黄色在线网站| 欧美激情网友自拍| 9999热视频在线观看| 91精品国产91久久| 自拍网站在线观看| 国产第一区电影| 国产精品4hu.www| 91在线精品播放| 中文字幕日韩在线| 精品免费国产| 精品午夜久久| 国产欧美自拍视频| 激情欧美一区二区三区| 成人综合视频在线| 美女在线观看视频一区二区| www.久久久久久久久久久| 国产精品一区在线观看你懂的| 国产精品欧美性爱| 99国产欧美久久久精品| 中文字幕网站在线观看| 国产精品国产三级国产aⅴ中文 | 视频一区视频二区国产精品| 黄色av电影在线观看| 欧美激情按摩在线| 亚洲伊人av| 成人h视频在线观看播放| 77成人影视| 蜜桃麻豆91| 91久久国产| 国产欧美日韩网站| 免费xxxx性欧美18vr| 好吊操视频这里只有精品| 91蝌蚪国产九色| 国产精品视频看看| 亚洲国产日韩a在线播放性色| 国产视频1区2区| 日韩一区二区电影在线| 六十路在线观看| 欧美成在线视频| 欧美片第一页| 91成人免费视频| 精品久久久久中文字幕小说| 福利网在线观看| 午夜一区二区三区不卡视频| 亚洲制服中文字幕| 久久免费午夜影院| 久操免费在线视频| 欧美日韩国产免费| 深夜影院在线观看| 欧美黑人xxx| 日韩第二十一页| 欧美一区二区在线视频观看| 欧美1区免费| 一区二区三区免费播放| www.亚洲免费av| 视频这里只有精品| 欧美亚州韩日在线看免费版国语版| 日韩一卡二卡在线| 久久资源免费视频| 国产成+人+综合+亚洲欧美| 精品在线一区| 国模 一区 二区 三区| 在线观看免费污视频| 久久久久久久久岛国免费| 久久久久久欧美精品se一二三四 | 一区二区三区亚洲视频| 亚洲精选中文字幕| 91九色在线播放| 亚洲xxx自由成熟| 99热精品久久| 天天爽夜夜爽一区二区三区| 久久这里只有精品视频网| 国产一级二级三级| 日韩欧美在线综合网| 黄色网址在线免费观看| 国产欧美 在线欧美| 狠狠色丁香婷婷综合影院| 日本精品免费在线观看| 成人激情视频网站| 久久这里只有精品国产| 欧美电影免费提供在线观看| 操你啦视频在线| 91色p视频在线| 天天射天天综合网| 三上悠亚av一区二区三区| 国产欧美精品区一区二区三区 | 每日更新av在线播放| 91精品国产99| 老司机精品视频在线播放| 国自产拍偷拍精品啪啪一区二区| 成人高清免费观看| 色播视频在线播放| 亚洲精选中文字幕| 亚洲伦乱视频| 亚洲 日韩 国产第一区| 男女激情视频一区| 国产在视频线精品视频| 欧美日韩aaaaaa| 黄色网页在线免费看| 亚洲一区亚洲二区亚洲三区| 欧美 日韩 国产一区二区在线视频| 欧美体内she精高潮| 亚洲一区二区三区爽爽爽爽爽| 懂色av成人一区二区三区| 91tv亚洲精品香蕉国产一区7ujn| 欧美精品中文字幕亚洲专区| 国产成人黄色片| 久久久久免费观看| 五月婷婷丁香在线| 爱福利视频一区| 免费看日产一区二区三区 | 亚洲欧美日韩久久精品| 99国产精品欲| 久久男人资源视频| 精品一区欧美| 成年网站免费在线观看| 一个色在线综合| 日本五码在线| 成人激情视频小说免费下载| 欧美日韩国产综合网| 女人被狂躁c到高潮| 欧美性三三影院| 3d玉蒲团在线观看| 久久久久欧美| 美国欧美日韩国产在线播放| 欧美人妻精品一区二区三区| 日韩精品小视频| 色诱色偷偷久久综合| 九色自拍视频在线观看| 国产精品五月天| 国产 欧美 自拍|