成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

淺談Android IPC機(jī)制之Binder的工作機(jī)制

瀏覽:212日期:2022-09-18 11:21:47
目錄進(jìn)程和線(xiàn)程的關(guān)系跨進(jìn)程的種類(lèi)Serializable,Parcelable接口Binder進(jìn)程和線(xiàn)程的關(guān)系

按照操作系統(tǒng)中的描述,線(xiàn)程是CPU調(diào)度的最小單位,同時(shí)線(xiàn)程也是一種有限的系統(tǒng)資源。而進(jìn)程一般是指一個(gè)執(zhí)行單元,在pc端或者移動(dòng)端上是指一個(gè)程序或者一個(gè)應(yīng)用。一個(gè)進(jìn)程中可以包含一個(gè)或者是多個(gè)線(xiàn)程。所以他們的關(guān)系應(yīng)該是包含和被包含的關(guān)系。

跨進(jìn)程的種類(lèi)

在A(yíng)ndroid中跨進(jìn)程通信的方式有很多種,Bundle,文件共享,AIDL,Messenger,ContentProvider,Socket,這些都能實(shí)現(xiàn)進(jìn)程間之間的通信,當(dāng)然,雖然都能夠?qū)崿F(xiàn)進(jìn)程間通信,但是他們之間的實(shí)現(xiàn)原理或者說(shuō)是底層的實(shí)現(xiàn)方式都是不一樣的。下面,我們將會(huì)一一說(shuō)明。

注:很多同學(xué)覺(jué)得創(chuàng)建進(jìn)程就應(yīng)該創(chuàng)建一個(gè)新的應(yīng)用。其實(shí)不是的。只要我們?cè)贏(yíng)ndroidMenifest上加上這一句代碼就可以了android:process=“:remote”具體的,同學(xué)們可以自己的了解。

在說(shuō)IPC之前,先說(shuō)一下一些基礎(chǔ)概念,這樣對(duì)后面的內(nèi)容能夠更好的理解。

Serializable,Parcelable接口

Serializable接口是java提供的一個(gè)序列化的接口,這是一個(gè)空的接口,為對(duì)象提供標(biāo)準(zhǔn)的序列化和反序列化操作。

Serializable序列化和反序列化,都是采ObjectOutputStream和ObjectInputStream就可以實(shí)現(xiàn),當(dāng)然這些系統(tǒng)基本已經(jīng)為我們實(shí)現(xiàn)了。

Parcelable接口,是Android自帶的一種序列化方式。序列化和反序列化都是通過(guò)writeToParcel方法來(lái)完成的。

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

Binder

直觀(guān)來(lái)說(shuō),Binder是Android中的一個(gè)類(lèi),它實(shí)現(xiàn)了IBinder接口,從IPC的角度來(lái)說(shuō),Binder是Android中的一種跨進(jìn)程通信的一種方式,同時(shí)還可以理解為是一種虛擬的物理設(shè)備,它的設(shè)備驅(qū)動(dòng)是/dev/binder/。從Framework角度來(lái)說(shuō),Binder是ServiceManager的橋梁。從應(yīng)用層來(lái)說(shuō),Binder是客戶(hù)端和服務(wù)端進(jìn)行通信的媒介。

在A(yíng)ndroid開(kāi)發(fā)中,Binder主要用在Service中,包括AIDL和Messenger,由于Messenger的底層其實(shí)就是Aidl,所以現(xiàn)在我們以AIDL來(lái)分析一下binder的工作機(jī)制。

上代碼:

/* * 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;}

上面這段代碼是系統(tǒng)生成的,在gen目錄下可以看到根據(jù)MyAIDLService.aidl系統(tǒng)為我們生成了MyAIDLService.java這個(gè)類(lèi)。我們先來(lái)了解一下這個(gè)類(lèi)中每個(gè)方法的含義:

DESCRIPTOR:Binder的唯一標(biāo)識(shí),一般用于當(dāng)前Binder的類(lèi)名表示。

asInterface(android.os.IBinder obj):用于將服務(wù)端的Binder對(duì)象轉(zhuǎn)換成客戶(hù)端所需的AIDL接口類(lèi)型的對(duì)象,這種轉(zhuǎn)化過(guò)程是區(qū)分進(jìn)程的,如果客戶(hù)端和服務(wù)端位于同一個(gè)進(jìn)程,那么這個(gè)方法返回的是服務(wù)端的stub對(duì)象本身,否則返回的是系統(tǒng)封裝后的Stub.proxy對(duì)象。

asBinder():用于返回當(dāng)前Binder對(duì)象。

onTransact:該方法運(yùn)行在服務(wù)端的Binder線(xiàn)程池中,當(dāng)客戶(hù)端發(fā)起跨進(jìn)程通信請(qǐng)求的時(shí)候,遠(yuǎn)程請(qǐng)求通過(guò)系統(tǒng)底層封裝后交給該方法處理。注意這個(gè)方法public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags),服務(wù)端通過(guò)code可以確定客戶(hù)端所請(qǐng)求的目標(biāo)方法是什么,接著從data中取出目標(biāo)方法所需的參數(shù),然后執(zhí)行目標(biāo)方法。當(dāng)目標(biāo)方法執(zhí)行完畢后,就像reply中寫(xiě)入返回值。這個(gè)方法的執(zhí)行過(guò)程就是這樣的。如果這個(gè)方法返回false,客戶(hù)端是會(huì)請(qǐng)求失敗的,所以我們可以在這個(gè)方法中做一些安全驗(yàn)證。

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

這個(gè)方法運(yùn)行在客戶(hù)端中,當(dāng)客戶(hù)端調(diào)用此方法的時(shí)候,它的內(nèi)部實(shí)現(xiàn)是這樣的:首先創(chuàng)建該方法所需要的輸入類(lèi)型Parcel對(duì)象_data,然后調(diào)用transact方法發(fā)起遠(yuǎn)程調(diào)用請(qǐng)求,同時(shí)當(dāng)前線(xiàn)程掛起,然后服務(wù)端的OnTransact方法會(huì)被調(diào)用,直到RPC過(guò)程返回后,當(dāng)前線(xiàn)程繼續(xù)執(zhí)行,并從_reply中讀取返回的數(shù)據(jù)。

如圖:Binder的工作機(jī)制

淺談Android IPC機(jī)制之Binder的工作機(jī)制

從上面分析,我們明白了Binder的工作機(jī)制但是要注意一些問(wèn)題:

1.當(dāng)客戶(hù)端發(fā)起請(qǐng)求時(shí),由于當(dāng)前線(xiàn)程會(huì)被掛起,直到服務(wù)端返回?cái)?shù)據(jù),如果這個(gè)遠(yuǎn)程方法很耗時(shí)的話(huà),那么是不能夠在UI線(xiàn)程,也就是主線(xiàn)程中發(fā)起這個(gè)遠(yuǎn)程請(qǐng)求的。

2.由于Service的Binder方法運(yùn)行在線(xiàn)程池中,所以Binder方法不管是耗時(shí)還是不耗時(shí)都應(yīng)該采用同步的方式,因?yàn)樗呀?jīng)運(yùn)行在一個(gè)線(xiàn)程中了。

以上就是淺談Android IPC機(jī)制之Binder的工作機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于A(yíng)ndroid IPC機(jī)制之Binder的工作機(jī)制的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
精品1区2区3区| 亚洲三级电影全部在线观看高清| 国产精品毛片无遮挡高清| 懂色av一区二区三区蜜臀| 可以免费看不卡的av网站| **性色生活片久久毛片| 欧美不卡一区| 国产欧美一区二区精品秋霞影院| 不卡的av在线| 精品国产乱码久久久久久蜜臀| 国产一区在线观看视频| 日本乱人伦一区| 亚洲国产综合在线| 中文精品视频| 亚洲精品国产视频| 亚洲精品无人区| √…a在线天堂一区| 黄色在线成人| 成人欧美一区二区三区在线播放| 午夜视频精品| 国产精品美女久久久久久久久 | 亚洲国产99| 亚洲美腿欧美偷拍| 一区二区冒白浆视频| 一区二区三区日韩欧美精品| 99伊人成综合| 亚洲成av人片一区二区三区| 久久香蕉精品| 毛片一区二区三区| 欧美日韩视频专区在线播放| 久久精品免费观看| 欧美精品123区| 国产成人啪免费观看软件| 亚洲精品在线观看网站| 午夜精品国产| 亚洲欧美一区二区三区国产精品| 夜夜嗨一区二区| 亚洲一区二区三区自拍| 噜噜噜91成人网| 奇米精品一区二区三区在线观看| 在线观看成人免费视频| 久久精品二区亚洲w码| 3atv一区二区三区| 99国产精品视频免费观看| 国产欧美久久久精品影院| 国产专区一区| 亚洲综合激情网| 日本韩国视频一区二区| 国产一区二区三区四| 欧美电影免费提供在线观看| 91麻豆产精品久久久久久| 国产精品久久久久久久久动漫 | 亚洲激情av在线| 国产伦精品一区二区三区四区免费| 亚洲第一二三四区| 欧美日韩视频不卡| 成人性生交大片免费看中文网站| 精品国产乱码久久| 国产精品99免费看| 艳妇臀荡乳欲伦亚洲一区| 欧美亚洲尤物久久| 99久久国产综合色|国产精品| 中文字幕一区av| 久久一区二区三区av| 国产精一区二区三区| 久久久国产午夜精品| 亚洲深爱激情| 精品一区二区三区免费| 欧美成人猛片aaaaaaa| 黄色国产精品| 日韩电影免费在线看| 精品日韩一区二区三区 | 欧美午夜一区二区三区免费大片| 丁香一区二区三区| 136国产福利精品导航| 色综合久久久久网| 成人黄色在线看| 一区二区三区国产精华| 欧美日韩国产一级| 欧美黄色一区二区| 视频一区视频二区中文| 欧美成人猛片aaaaaaa| 在线一区亚洲| 韩国女主播一区| 国产欧美精品国产国产专区 | 精品区一区二区| 久久久久久影视| 韩日精品视频| 欧美大黄免费观看| 久久精品国产澳门| 欧美高清视频不卡网| 欧美三级韩国三级日本三斤| 99久久99久久精品免费看蜜桃| 亚洲乱码国产乱码精品精的特点 | 国产宾馆实践打屁股91| 国产精品传媒视频| 欧美三日本三级三级在线播放| 欧美国产一区二区三区激情无套| 日日摸夜夜添夜夜添国产精品| 精品国产91九色蝌蚪| 久久男女视频| 欧美大片一区| 久久91精品久久久久久秒播| 日本一区免费视频| 欧美三级电影一区| 欧美三级黄美女| 激情五月播播久久久精品| 国产精品久久免费看| 欧美日韩一级黄| 日韩一级在线| 99天天综合性| 久久激五月天综合精品| 亚洲欧美中日韩| 91精品国产色综合久久久蜜香臀| 99热这里只有成人精品国产| 粉嫩一区二区三区在线看| 亚洲一区二区三区影院| 久久女同性恋中文字幕| 91精彩视频在线观看| 亚洲电影专区| 国产成人免费在线观看| 午夜av一区二区三区| 欧美经典一区二区| 欧美日韩精品系列| 国产亚洲精品久久久久婷婷瑜伽| 99久久精品免费看国产 | 午夜欧美精品| 国产酒店精品激情| 日韩vs国产vs欧美| 一区二区三区四区在线播放| 国产喂奶挤奶一区二区三区 | 国产精品久久久久一区二区三区| 欧美性受xxxx黑人xyx性爽| 伊人久久av导航| www.av亚洲| 国内久久精品视频| 天天影视色香欲综合网老头| 日韩美女精品在线| 精品第一国产综合精品aⅴ| 在线视频一区二区三区| 一区二区三区国产盗摄| 欧美久久综合| 成人av免费网站| 精品一区二区三区蜜桃| 日韩精品午夜视频| 一区二区在线看| 国产精品成人免费在线| 欧美大胆一级视频| 欧美性三三影院| 国产精品综合| 亚洲每日更新| 亚洲视频中文| 欧美日韩在线精品一区二区三区| 成人激情文学综合网| 国产在线不卡一卡二卡三卡四卡| 婷婷久久综合九色综合伊人色| 一区二区在线观看视频在线观看| 国产精品久久久久aaaa樱花 | 欧美高清你懂得| 欧美三级三级三级爽爽爽| 欧美综合国产| 国产婷婷精品| 99视频一区| 亚洲激情另类| 亚洲激情视频| 一区在线视频| 亚洲图片在线| 极品中文字幕一区| 韩国亚洲精品| 永久域名在线精品| 亚洲黄色大片| 国产日产高清欧美一区二区三区| 一区二区自拍| 影音先锋久久| 亚洲黄色天堂| 在线亚洲观看| 美女国产一区| 久热精品视频| 欧美调教femdomvk| 91国偷自产一区二区开放时间 | 亚洲高清在线观看一区| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美一区二区三区视频| 欧美精品免费视频| 欧美日韩高清一区二区不卡| 欧美日韩国产系列| 欧美日本乱大交xxxxx| 欧美精品一级二级三级| 56国语精品自产拍在线观看| 91麻豆精品国产| 欧美不卡一区二区三区四区| 久久婷婷国产综合国色天香| 欧美精品一区二区三区久久久| 欧美精品一区二区三区在线 | 亚洲一级二级三级| 天天综合天天做天天综合| 日韩av二区在线播放| 免费av成人在线| 韩国视频一区二区| 成人av在线资源网站|