日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

淺談Android IPC機制之Binder的工作機制

瀏覽:252日期:2022-09-18 11:21:47
目錄進程和線程的關系跨進程的種類Serializable,Parcelable接口Binder進程和線程的關系

按照操作系統中的描述,線程是CPU調度的最小單位,同時線程也是一種有限的系統資源。而進程一般是指一個執行單元,在pc端或者移動端上是指一個程序或者一個應用。一個進程中可以包含一個或者是多個線程。所以他們的關系應該是包含和被包含的關系。

跨進程的種類

在Android中跨進程通信的方式有很多種,Bundle,文件共享,AIDL,Messenger,ContentProvider,Socket,這些都能實現進程間之間的通信,當然,雖然都能夠實現進程間通信,但是他們之間的實現原理或者說是底層的實現方式都是不一樣的。下面,我們將會一一說明。

注:很多同學覺得創建進程就應該創建一個新的應用。其實不是的。只要我們在AndroidMenifest上加上這一句代碼就可以了android:process=“:remote”具體的,同學們可以自己的了解。

在說IPC之前,先說一下一些基礎概念,這樣對后面的內容能夠更好的理解。

Serializable,Parcelable接口

Serializable接口是java提供的一個序列化的接口,這是一個空的接口,為對象提供標準的序列化和反序列化操作。

Serializable序列化和反序列化,都是采ObjectOutputStream和ObjectInputStream就可以實現,當然這些系統基本已經為我們實現了。

Parcelable接口,是Android自帶的一種序列化方式。序列化和反序列化都是通過writeToParcel方法來完成的。

兩者的區別:Serializable是java的序列化接口使用簡單,但是由于序列化和反序列化的過程需要大量的I/o操作,所以性能較差。Parcelable接口使用較為麻煩,但是效率很高,但是存在一個很大的缺點,就是被Parcelable將對象序列化以后,要將對象保存到磁盤中的,將會很麻煩。所以建議是使用Serializable。

Binder

直觀來說,Binder是Android中的一個類,它實現了IBinder接口,從IPC的角度來說,Binder是Android中的一種跨進程通信的一種方式,同時還可以理解為是一種虛擬的物理設備,它的設備驅動是/dev/binder/。從Framework角度來說,Binder是ServiceManager的橋梁。從應用層來說,Binder是客戶端和服務端進行通信的媒介。

在Android開發中,Binder主要用在Service中,包括AIDL和Messenger,由于Messenger的底層其實就是Aidl,所以現在我們以AIDL來分析一下binder的工作機制。

上代碼:

/* * This file is auto-generated. DO NOT MODIFY. * Original file: /Users/huangjialin/MyApplication/service/src/main/aidl/aidl/MyAIDLService.aidl */package aidl;// Declare any non-default types here with import statementspublic interface MyAIDLService extends android.os.IInterface { /** * Local-side IPC implementation stub class. */ public static abstract class Stub extends android.os.Binder implements aidl.MyAIDLService {private static final java.lang.String DESCRIPTOR = 'aidl.MyAIDLService';/** * Construct the stub at attach it to the interface. */public Stub() { this.attachInterface(this, DESCRIPTOR);}/** * Cast an IBinder object into an aidl.MyAIDLService interface, * generating a proxy if needed. */public static aidl.MyAIDLService asInterface(android.os.IBinder obj) { if ((obj == null)) {return null; } android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); if (((iin != null) && (iin instanceof aidl.MyAIDLService))) {return ((aidl.MyAIDLService) iin); } return new aidl.MyAIDLService.Stub.Proxy(obj);}@Overridepublic android.os.IBinder asBinder() { return this;}@Overridepublic boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException { switch (code) {case INTERFACE_TRANSACTION: { reply.writeString(DESCRIPTOR); return true;}case TRANSACTION_getString: { data.enforceInterface(DESCRIPTOR); java.lang.String _result = this.getString(); reply.writeNoException(); reply.writeString(_result); return true;} } return super.onTransact(code, data, reply, flags);}private static class Proxy implements aidl.MyAIDLService { private android.os.IBinder mRemote; Proxy(android.os.IBinder remote) {mRemote = remote; } @Override public android.os.IBinder asBinder() {return mRemote; } public java.lang.String getInterfaceDescriptor() {return DESCRIPTOR; } @Override public java.lang.String getString() throws android.os.RemoteException {android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();java.lang.String _result;try { _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact(Stub.TRANSACTION_getString, _data, _reply, 0); _reply.readException(); _result = _reply.readString();} finally { _reply.recycle(); _data.recycle();}return _result; }}static final int TRANSACTION_getString = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); } public java.lang.String getString() throws android.os.RemoteException;}

上面這段代碼是系統生成的,在gen目錄下可以看到根據MyAIDLService.aidl系統為我們生成了MyAIDLService.java這個類。我們先來了解一下這個類中每個方法的含義:

DESCRIPTOR:Binder的唯一標識,一般用于當前Binder的類名表示。

asInterface(android.os.IBinder obj):用于將服務端的Binder對象轉換成客戶端所需的AIDL接口類型的對象,這種轉化過程是區分進程的,如果客戶端和服務端位于同一個進程,那么這個方法返回的是服務端的stub對象本身,否則返回的是系統封裝后的Stub.proxy對象。

asBinder():用于返回當前Binder對象。

onTransact:該方法運行在服務端的Binder線程池中,當客戶端發起跨進程通信請求的時候,遠程請求通過系統底層封裝后交給該方法處理。注意這個方法public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags),服務端通過code可以確定客戶端所請求的目標方法是什么,接著從data中取出目標方法所需的參數,然后執行目標方法。當目標方法執行完畢后,就像reply中寫入返回值。這個方法的執行過程就是這樣的。如果這個方法返回false,客戶端是會請求失敗的,所以我們可以在這個方法中做一些安全驗證。

public java.lang.String getString() throws android.os.RemoteException:

這個方法運行在客戶端中,當客戶端調用此方法的時候,它的內部實現是這樣的:首先創建該方法所需要的輸入類型Parcel對象_data,然后調用transact方法發起遠程調用請求,同時當前線程掛起,然后服務端的OnTransact方法會被調用,直到RPC過程返回后,當前線程繼續執行,并從_reply中讀取返回的數據。

如圖:Binder的工作機制

淺談Android IPC機制之Binder的工作機制

從上面分析,我們明白了Binder的工作機制但是要注意一些問題:

1.當客戶端發起請求時,由于當前線程會被掛起,直到服務端返回數據,如果這個遠程方法很耗時的話,那么是不能夠在UI線程,也就是主線程中發起這個遠程請求的。

2.由于Service的Binder方法運行在線程池中,所以Binder方法不管是耗時還是不耗時都應該采用同步的方式,因為它已經運行在一個線程中了。

以上就是淺談Android IPC機制之Binder的工作機制的詳細內容,更多關于Android IPC機制之Binder的工作機制的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久亚洲国产| 狠狠爱成人网| 国产成人精品三级高清久久91| 国产成人1区| 99久久九九| 亚洲精品进入| 国产不卡av一区二区| 伊人精品视频| 日本色综合中文字幕| 不卡专区在线| 亚洲无线观看| 国产精品精品| 中文字幕日韩亚洲| 日韩.com| 狠狠干成人综合网| 久久wwww| 亚洲欧美不卡| 韩国女主播一区二区三区| 日韩视频不卡| 国产精品亚洲欧美日韩一区在线| 丝袜美腿一区| 日韩不卡一区二区| 999久久久国产精品| 7777精品| 亚洲福利国产| 国产精品nxnn| 中文国产一区| 精品久久久久中文字幕小说| 丝袜美腿成人在线| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 男女激情视频一区| 乱一区二区av| 日本欧美在线看| а√天堂8资源在线| 日韩欧美美女在线观看| 欧美成人精品三级网站| 日韩精选在线| 亚洲福利精品| 国产激情一区| 亚洲永久精品唐人导航网址| 日韩伦理在线一区| 国产情侣久久| 综合干狼人综合首页| 日韩在线短视频| 免费亚洲婷婷| 日本中文字幕不卡| 黄色亚洲免费| 日韩欧美国产精品综合嫩v| 日韩国产高清在线| 一区二区亚洲精品| 日韩久久精品| 国内精品亚洲| 国产精品色婷婷在线观看| 久久高清一区| 成人av二区| 国产精品字幕| 精品99在线| 国产高清日韩| 国产高清亚洲| 免费一级片91| 亚洲涩涩在线| 久久国产麻豆精品| 国产视频一区欧美| 视频在线不卡免费观看| 中文字幕日韩欧美精品高清在线| 高清一区二区三区av| 亚洲一级淫片| 欧美sss在线视频| 亚欧成人精品| 欧美日中文字幕| 久久99高清| 日韩国产高清在线| 在线一区免费观看| 蜜桃成人精品| 久久只有精品| 日韩动漫一区| 99国产精品| 成人久久一区| 国产一区一一区高清不卡| 青草久久视频| 日韩欧美中文字幕一区二区三区| 久久高清国产| 巨乳诱惑日韩免费av| 波多野结衣一区| 欧美+日本+国产+在线a∨观看| 色偷偷色偷偷色偷偷在线视频| 精品九九久久| 国产一区二区三区精品在线观看| 中文字幕在线官网| 日韩欧美三级| 免费观看不卡av| 99在线|亚洲一区二区| 亚洲一区不卡| 亚洲最大av| 91免费精品国偷自产在线在线| 日韩激情综合| 国产精品超碰| 成人午夜亚洲| 福利视频一区| 国产高潮在线| 亚洲成人va| 国产高清久久| 日韩精品一二三四| 日本色综合中文字幕| 国产精品视频首页| 久久午夜影院| a天堂资源在线| 亚洲特级毛片| 视频一区中文字幕| 日韩精品视频中文字幕| 国产另类在线| 黑人精品一区| 激情综合网站| 久热精品在线| 奇米色欧美一区二区三区| 国产精品分类| 日韩中文首页| 日韩午夜一区| 日韩福利视频网| 国产一区福利| av亚洲免费| 日韩激情视频网站| 国产精品不卡| 妖精视频成人观看www| 青草av.久久免费一区| 国产在线一区不卡| 在线国产一区| 91伊人久久| 久久伊人国产| 久久精品动漫| 日韩精品免费观看视频| 麻豆精品视频在线| 欧美午夜精彩| 日韩av一二三| 另类中文字幕国产精品| 亚洲天堂日韩在线| 成人在线视频免费看| 99在线|亚洲一区二区| 国产探花在线精品一区二区| 欧洲一区二区三区精品| 免费久久99精品国产| 免费日韩一区二区三区| 精品一区三区| 欧美在线黄色| 九九色在线视频| 亚洲精品成a人ⅴ香蕉片| 精品国产美女a久久9999| 免费日韩av片| 精品国产aⅴ| 丝袜美腿一区二区三区| 精品99在线| 蜜桃av一区二区| a天堂资源在线| 亚洲毛片一区| 日韩在线欧美| 亚洲精品自拍| 日本h片久久| 国产精品久久久久久久久久10秀| 午夜av成人| 免费的成人av| 欧美激情麻豆| 九九久久婷婷| 国产午夜久久av| 成人在线网站| 婷婷综合电影| 欧美xxxx中国| 亚洲欧美网站| 国产欧美三级| 伊人久久成人| 日韩福利在线观看| 蜜臀av免费一区二区三区| 国产激情欧美| 伊人精品久久| 成人美女视频| 国产精品mv在线观看| 欧美精品1区| 婷婷综合亚洲| 国产精品久久久久久久久久妞妞 | 国产精品久久久久久久免费软件| 日本不良网站在线观看| 国产成人久久精品一区二区三区| 亚洲性视频h| 国产一区二区久久久久| 日韩不卡免费视频| 久久福利一区| 欧美69视频| 国产自产自拍视频在线观看| 精品久久视频| 国产精品av一区二区| 国产精品v日韩精品v欧美精品网站 | 亚洲天堂免费电影| 日本精品另类| 亚洲精品中文字幕乱码| 精品资源在线| 日韩一区二区三区高清在线观看| 亚洲va中文在线播放免费| 青青草精品视频| 在线精品小视频| 成人国产精选| 麻豆91在线播放|