新聞中心
Android跨進(jìn)程通信-共享內(nèi)存
1、通過mmap或者內(nèi)存共享的Linux IPC機(jī)制 直接將同一段內(nèi)存映射到數(shù)據(jù)發(fā)送進(jìn)程和數(shù)據(jù)接收進(jìn)程的用戶空間,這樣數(shù)據(jù)發(fā)送進(jìn)程只需要將數(shù)據(jù)拷貝到共享的內(nèi)存區(qū)域,數(shù)據(jù)接收進(jìn)程就可以直接使用數(shù)據(jù)了。
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供長壽網(wǎng)站建設(shè)、長壽做網(wǎng)站、長壽網(wǎng)站設(shè)計、長壽網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、長壽企業(yè)網(wǎng)站模板建站服務(wù),十載長壽做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
2、所以無論是應(yīng)用內(nèi)還是應(yīng)用間,均無法通過共享內(nèi)存來實(shí)現(xiàn)進(jìn)程間通信。
3、ContentProvider 為存儲和獲取數(shù)據(jù)提供統(tǒng)一的接口,可以在不同應(yīng)用程序之間共享數(shù)據(jù)。ContentProvider 主要有以下優(yōu)點(diǎn):進(jìn)程間 進(jìn)行數(shù)據(jù)交互 & 共享,即跨進(jìn)程通信。ContentProvider 底層是采用 Android 中的 Binder 機(jī)制。
4、而Android系統(tǒng)是基于Linux內(nèi)核實(shí)現(xiàn)的,Linux已經(jīng)提供了多種進(jìn)程間通信機(jī)制,比如:管道、消息隊列、共享內(nèi)存和套接字(Socket)等等。
5、android系統(tǒng)中應(yīng)用程序之間不能共享內(nèi)存。在不同應(yīng)用程序之間進(jìn)行的數(shù)據(jù)交換叫跨進(jìn)程。在android SDK中提供了4種用于跨進(jìn)程通訊的方式。
6、主要有4種方式:這4種方式正好對應(yīng)于android系統(tǒng)中4種應(yīng)用程序組件:Activity、Content Provider、Broadcast和Service。主要實(shí)現(xiàn)原理:由于應(yīng)用程序之間不能共享內(nèi)存。
安卓IPC跨進(jìn)程通訊:AIDL+Retrofit——AndLinker的初步使用
1、需要用到安卓跨進(jìn)程通訊,IPC (進(jìn)程間通信) 的時候,AndLinker是一款A(yù)ndroid上的IPC (進(jìn)程間通信) 庫,結(jié)合了 AIDL 和 Retrofit 的諸多特性,且可以與 RxJava 和 RxJava2 的Call Adapters無縫結(jié)合使用。
2、要實(shí)現(xiàn)跨進(jìn)程通信,需要借助AIDL(Android Interface Definition Language)。Android中的跨進(jìn)程服務(wù)其實(shí)是采用C/S的架構(gòu),因而AIDL的目的就是實(shí)現(xiàn)通信接口。
3、通常需要存到本地磁盤的數(shù)據(jù)就使用Serializable,其他情況就使用效率更高的Parcelable。 IPC 即 Inter-Process Communication (進(jìn)程間通信)。Android 基于 Linux,而 Linux 出于安全考慮,不同進(jìn)程間不能之間操作對方的數(shù)據(jù),這叫做“進(jìn)程隔離”。
4、不需要返回 Binder 對象,這意味著使用者不需要編寫繁瑣沒任何提示的AIDL文件。
Android跨進(jìn)程通信-mmap函數(shù)
這里我再介紹一種mmap()在Android系統(tǒng)上的使用場景, mmap的設(shè)計目的就是為了讓文件的訪問更有效率 ,所以當(dāng)APK進(jìn)行安裝時,為了更高效的讀取APK包里面的文件,同樣也用到了mmap函數(shù)。
可以看到Android的匿名共享內(nèi)存是通過 ashmem_create_region() 函數(shù)來申請共享內(nèi)存的,它會在/dev/ashmem下創(chuàng)建一個虛擬文件,Linux原生共享內(nèi)存是通過shmget()函數(shù),并會在/dev/shm下創(chuàng)建虛擬文件。
Client,Server和Service Manager都可以通過系統(tǒng)調(diào)用open,mmap和ioctl來訪問設(shè)備文件/dev/binder。從而實(shí)現(xiàn)與Binder驅(qū)動的交互間接實(shí)現(xiàn)進(jìn)程間的通信。其中 Android Bander設(shè)計與實(shí)現(xiàn) - 設(shè)計篇 對上述的角色中有詳細(xì)的講解。
Android采用的是Binder作為IPC的機(jī)制,只需復(fù)制一次。 Binder翻譯過來是粘合劑,是進(jìn)程之間的粘合劑。
Android跨進(jìn)程傳遞大數(shù)據(jù)
共享內(nèi)存在Android系統(tǒng)中主要的使用場景是 用來傳輸大數(shù)據(jù) ,并且 Android并沒有直接使用Linux原生的共享內(nèi)存方式,而是設(shè)計了Ashmem匿名共享內(nèi)存 。
由于Serializable效率過慢,為了在程序內(nèi)不同組件及進(jìn)程間(AIDL)高效的傳輸數(shù)據(jù),Android推出了Parceable的設(shè)計,這些數(shù)據(jù)僅在內(nèi)存中存在。
但是Intent的傳送效率也不是很高,特別是當(dāng)傳遞一些如Bitmap的大數(shù)據(jù),用Intent傳遞超過500K的Bitmap,就會造成Framework層的Java Binder掛掉,結(jié)果就是傳遞不成功。這點(diǎn)可以算成是Android的一個弊端,沒有很好的解決方案。
網(wǎng)頁標(biāo)題:android跨進(jìn)程 Android跨進(jìn)程共享頭像
分享網(wǎng)址:http://www.dlmjj.cn/article/dgejsse.html