真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

android進(jìn)程間通信,android進(jìn)程間通信可以通過(guò)什么技術(shù)

Android 進(jìn)程間通信的幾種實(shí)現(xiàn)方式

Android 進(jìn)程間通信的幾種實(shí)現(xiàn)方式

十多年的南城網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整南城建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“南城網(wǎng)站設(shè)計(jì)”,“南城網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

主要有4種方式:

這4種方式正好對(duì)應(yīng)于android系統(tǒng)中4種應(yīng)用程序組件:Activity、Content Provider、Broadcast和Service。

主要實(shí)現(xiàn)原理:

由于應(yīng)用程序之間不能共享內(nèi)存。為了在不同應(yīng)用程序之間交互數(shù)據(jù)(跨進(jìn)程通訊),Android?SDK中提供了4種用于跨進(jìn)程通訊的方式進(jìn)行交互數(shù)據(jù),實(shí)現(xiàn)進(jìn)程間通信主要是使用sdk中提供的4組組件根據(jù)實(shí)際開(kāi)發(fā)情況進(jìn)行實(shí)現(xiàn)數(shù)據(jù)交互。

詳細(xì)實(shí)現(xiàn)方式:

Acitivity實(shí)現(xiàn)方式

Activity的跨進(jìn)程訪問(wèn)與進(jìn)程內(nèi)訪問(wèn)略有不同。雖然它們都需要Intent對(duì)象,但跨進(jìn)程訪問(wèn)并不需要指定Context對(duì)象和Activity的 Class對(duì)象,而需要指定的是要訪問(wèn)的Activity所對(duì)應(yīng)的Action(一個(gè)字符串)。有些Activity還需要指定一個(gè)Uri(通過(guò) Intent構(gòu)造方法的第2個(gè)參數(shù)指定)。 在android系統(tǒng)中有很多應(yīng)用程序提供了可以跨進(jìn)程訪問(wèn)的Activity,例如,下面的代碼可以直接調(diào)用撥打電話的Activity。

Intent?callIntent?=?new??Intent(Intent.ACTION_CALL,?Uri.parse("tel:12345678"?);??

startActivity(callIntent);

Content Provider實(shí)現(xiàn)方式

Android應(yīng)用程序可以使用文件或SqlLite數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)數(shù)據(jù)。Content Provider提供了一種在多個(gè)應(yīng)用程序之間數(shù)據(jù)共享的方式(跨進(jìn)程共享數(shù)據(jù))

應(yīng)用程序可以利用Content Provider完成下面的工作

1. 查詢數(shù)據(jù)

2. 修改數(shù)據(jù)

3. 添加數(shù)據(jù)

4. 刪除數(shù)據(jù)

Broadcast 廣播實(shí)現(xiàn)方式

廣播是一種被動(dòng)跨進(jìn)程通訊的方式。當(dāng)某個(gè)程序向系統(tǒng)發(fā)送廣播時(shí),其他的應(yīng)用程序只能被動(dòng)地接收廣播數(shù)據(jù)。這就象電臺(tái)進(jìn)行廣播一樣,聽(tīng)眾只能被動(dòng)地收聽(tīng),而不能主動(dòng)與電臺(tái)進(jìn)行溝通。在應(yīng)用程序中發(fā)送廣播比較簡(jiǎn)單。只需要調(diào)用sendBroadcast方法即可。該方法需要一個(gè)Intent對(duì)象。通過(guò)Intent對(duì)象可以發(fā)送需要廣播的數(shù)據(jù)。

Service?實(shí)現(xiàn)方式

常用的使用方式之一:利用AIDL Service實(shí)現(xiàn)跨進(jìn)程通信

這是我個(gè)人比較推崇的方式,因?yàn)樗啾菳roadcast而言,雖然實(shí)現(xiàn)上稍微麻煩了一點(diǎn),但是它的優(yōu)勢(shì)就是不會(huì)像廣播那樣在手機(jī)中的廣播較多時(shí)會(huì)有明顯的時(shí)延,甚至有廣播發(fā)送不成功的情況出現(xiàn)。

注意普通的Service并不能實(shí)現(xiàn)跨進(jìn)程操作,實(shí)際上普通的Service和它所在的應(yīng)用處于同一個(gè)進(jìn)程中,而且它也不會(huì)專門開(kāi)一條新的線程,因此如果在普通的Service中實(shí)現(xiàn)在耗時(shí)的任務(wù),需要新開(kāi)線程。

要實(shí)現(xiàn)跨進(jìn)程通信,需要借助AIDL(Android Interface Definition Language)。Android中的跨進(jìn)程服務(wù)其實(shí)是采用C/S的架構(gòu),因而AIDL的目的就是實(shí)現(xiàn)通信接口。

總結(jié)

跨進(jìn)程通訊這個(gè)方面service方式的通訊遠(yuǎn)遠(yuǎn)復(fù)雜于其他幾種通訊方式,實(shí)際開(kāi)發(fā)中Activity、Content Provider、Broadcast和Service。4種經(jīng)常用到,學(xué)習(xí)過(guò)程中要對(duì)沒(méi)種實(shí)現(xiàn)方式有一定的了解。

Android 使用Messenger實(shí)現(xiàn)跨進(jìn)程之間通信

以前講到跨進(jìn)程通信,我們總是第一時(shí)間想到AIDL(Android接口定義語(yǔ)言),實(shí)際上,使用Messenger在很多情況下是比使用AIDL簡(jiǎn)單得多的。

大家看到Messenger可能會(huì)很輕易的聯(lián)想到Message,然后很自然的進(jìn)一步聯(lián)想到Handler——沒(méi)錯(cuò),Messenger的核心其實(shí)就是Message以及Handler來(lái)進(jìn)行線程間的通信。

以下是如何使用Messenger的步驟:

綜上六步就能完成客戶端與Service的跨進(jìn)程雙向通信過(guò)程:

客戶端 - Service - 客戶端

簡(jiǎn)單的例子(客戶端向服務(wù)器端發(fā)送消息,服務(wù)器接收):

服務(wù)端主要是返給客戶端一個(gè)IBinder實(shí)例,以供服務(wù)端構(gòu)造Messenger,并且處理客戶端發(fā)送過(guò)來(lái)的Message。當(dāng)然,不要忘了要在Manifests文件里面注冊(cè).

客戶端就主要是發(fā)起與服務(wù)端的綁定,以及通過(guò)onServiceConnected()方法來(lái)過(guò)去服務(wù)端返回來(lái)的IBinder,借此構(gòu)造Messenger,從而可以通過(guò)發(fā)送Message的方式與服務(wù)端進(jìn)行交互。

服務(wù)器接收消息后回復(fù)消息給客戶端

客戶端修改:

客戶端需要添加一個(gè)handler用于接收消息

服務(wù)端修改:

在服務(wù)端的handler獲取客戶端發(fā)送的msg.replyTo

Android跨進(jìn)程通信

本文整理和引用他人的筆記,旨在個(gè)人復(fù)習(xí)使用。

參考鏈接:

;depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight

默認(rèn)情況下,一個(gè)app只會(huì)運(yùn)行在一個(gè)進(jìn)程中,進(jìn)程名為app的包名。

1. 分散內(nèi)存的占用

Android系統(tǒng)對(duì)每個(gè)應(yīng)用進(jìn)程的內(nèi)存占用是有限制的,占用內(nèi)存越大的進(jìn)程,被系統(tǒng)殺死的可能性就越大。使用多進(jìn)程可以減少主進(jìn)程占用的內(nèi)存,避免OOM問(wèn)題,降低被系統(tǒng)殺死的概率。

2. 實(shí)現(xiàn)多模塊

一個(gè)成熟的應(yīng)用一定是多模塊化的。項(xiàng)目解耦,模塊化,意味著開(kāi)辟新的進(jìn)程,有獨(dú)立的JVM,帶來(lái)數(shù)據(jù)解耦。模塊之間互不干預(yù),團(tuán)隊(duì)并行開(kāi)發(fā),同時(shí)責(zé)任分工也很明確。

3. 降低程序奔潰率

子進(jìn)程崩潰不會(huì)影響主進(jìn)程的運(yùn)行,能降低程序的崩潰率。

4. 實(shí)現(xiàn)一些特殊功能

比如可以實(shí)現(xiàn)推送進(jìn)程,使得主進(jìn)程退出后,能離線完成消息推送服務(wù)。還可以實(shí)現(xiàn)守護(hù)進(jìn)程,來(lái)喚醒主進(jìn)程達(dá)到?;钅康摹_€可以實(shí)現(xiàn)監(jiān)控進(jìn)程專門負(fù)責(zé)上報(bào)bug,進(jìn)而提升用戶體驗(yàn)。

android:process 屬性的值以冒號(hào)開(kāi)頭的就是 私有進(jìn)程 ,否則就是 公有進(jìn)程 。當(dāng)然命名還需要符合規(guī)范,不能以數(shù)字開(kāi)頭等等。

1. 前臺(tái)進(jìn)程

2. 可見(jiàn)進(jìn)程

3. 服務(wù)進(jìn)程

4. 后臺(tái)進(jìn)程

5. 空進(jìn)程

Android 會(huì)將進(jìn)程評(píng)定為它可能達(dá)到的最高級(jí)別。另外服務(wù)于另一進(jìn)程的進(jìn)程其級(jí)別永遠(yuǎn)不會(huì)低于其所服務(wù)的進(jìn)程。

創(chuàng)建新的進(jìn)程時(shí)會(huì)創(chuàng)建新的Application對(duì)象,而我們通常在Application的onCreate方法中只是完成一些全局的初始化操作,不需要多次執(zhí)行。

解決思路:獲取當(dāng)前進(jìn)程名,判斷是否為主進(jìn)程,只有主進(jìn)程的時(shí)候才執(zhí)行初始化操作

獲取當(dāng)前進(jìn)程名的兩種方法:

Application中判斷是否是主進(jìn)程(方法1例子):

Serializable 和 Parcelable是數(shù)據(jù)序列化的兩種方式,Android中只有進(jìn)行序列化過(guò)后的對(duì)象才能通過(guò)intent和Binder傳遞。

通常序列化后的對(duì)象完成傳輸后,通過(guò)反序列化獲得的是一個(gè)新對(duì)象,而不是原來(lái)的對(duì)象。

Serializable是java接口,位于java.io的路徑下。Serializable的原理就是把Java對(duì)象序列化為二進(jìn)制文件后進(jìn)行傳遞。Serializable使用起來(lái)非常簡(jiǎn)單,只需直接實(shí)現(xiàn)該接口就可以了。

Parcelable是Google為了解決Serializable效率低下的問(wèn)題,為Android特意設(shè)計(jì)的一個(gè)接口。Parcelable的原理是將一個(gè)對(duì)象完全分解,分解成可以傳輸?shù)臄?shù)據(jù)類型(如基本數(shù)據(jù)類型)再進(jìn)行傳遞。

通常需要存到本地磁盤的數(shù)據(jù)就使用Serializable,其他情況就使用效率更高的Parcelable。

IPC 即 Inter-Process Communication (進(jìn)程間通信)。Android 基于 Linux,而 Linux 出于安全考慮,不同進(jìn)程間不能之間操作對(duì)方的數(shù)據(jù),這叫做“進(jìn)程隔離”。

每個(gè)進(jìn)程的虛擬內(nèi)存空間(進(jìn)程空間)又被分為了 用戶空間和內(nèi)核空間 , 進(jìn)程只能訪問(wèn)自身用戶空間,只有操作系統(tǒng)能訪問(wèn)內(nèi)核空間。

由于進(jìn)程只能訪問(wèn)自身用戶空間,因此在傳統(tǒng)的IPC中,發(fā)送進(jìn)程需要通過(guò)copy_from_user(系統(tǒng)調(diào)用)將數(shù)據(jù)從自身用戶空間拷貝到內(nèi)核空間,再由接受進(jìn)程通過(guò)copy_to_user從內(nèi)核空間復(fù)拷貝到自身用戶空間,共需要拷貝2次,效率十分低下。Android采用的是Binder作為IPC的機(jī)制,只需復(fù)制一次。

Binder翻譯過(guò)來(lái)是粘合劑,是進(jìn)程之間的粘合劑。

Binder IPC通信的底層原理是 通過(guò)內(nèi)存映射(mmap),將接收進(jìn)程的用戶空間映射到內(nèi)核空間 ,有了這個(gè)映射關(guān)系,接收進(jìn)程就能通過(guò)用戶空間的地址獲得內(nèi)核空間的數(shù)據(jù),這樣只需發(fā)送進(jìn)程將數(shù)據(jù)拷貝到內(nèi)核空間就可完成通訊。

一次完整的Binder IPC通信:

從IPC的角度看,Binder是一種跨進(jìn)程通信機(jī)制(一種模型),Binder 是基于 C/S 架構(gòu)的,這個(gè)通信機(jī)制中主要涉及四個(gè)角色:Client、Server、ServiceManager和Binder驅(qū)動(dòng)。

Client、Server、ServiceManager都是運(yùn)行在用戶空間的進(jìn)程,他們通過(guò)系統(tǒng)調(diào)用(open、mmap 和 ioctl)來(lái)訪問(wèn)設(shè)備文件/dev/binder,從而實(shí)現(xiàn)與Binder驅(qū)動(dòng)的交互。Binder驅(qū)動(dòng)提供進(jìn)程間通信的能力(負(fù)責(zé)完成一些底層操作,比如開(kāi)辟數(shù)據(jù)接受緩存區(qū)等),是Client、Server和ServiceManager之間的橋梁。

Client、Server就是需要進(jìn)行通信兩個(gè)的進(jìn)程,通信流程:

細(xì)心的你一定發(fā)現(xiàn)了,注冊(cè)服務(wù)和獲得服務(wù)本身就是和ServiceManager進(jìn)行跨進(jìn)程通信。其實(shí)和ServiceManager的通信的過(guò)程也是獲取Binder對(duì)象(早已創(chuàng)建在Binder驅(qū)動(dòng)中,攜帶了注冊(cè)和查詢服務(wù)等接口方法)來(lái)使用,所有需要和ServiceManager通信的進(jìn)程,只需通過(guò)0號(hào)引用,就可以獲得這個(gè)Binder對(duì)象了。

AIDL內(nèi)部原理就是基于Binder的,可以借此來(lái)分析Binder的使用。

AIDL是接口定義語(yǔ)言,簡(jiǎn)短的幾句話就能定義好一個(gè)復(fù)雜的、內(nèi)部有一定功能的java接口。

先看看ICallBack.aidl文件,這里定義了一個(gè)接口,表示了服務(wù)端提供的功能。

被定義出來(lái)的java接口繼承了IInterface接口,并且內(nèi)部提供了一個(gè)Stub抽象類給服務(wù)端(相當(dāng)于封裝了一下,服務(wù)端只需繼承這個(gè)類,然后完成功能的里面具體的實(shí)現(xiàn))。

參考:

(以下是添加了回調(diào)的最終實(shí)現(xiàn),可以看參考鏈接一步一步來(lái))

為需要使用的類,創(chuàng)建aidl文件。

系統(tǒng)會(huì)自動(dòng)在main文件下生成aidl文件夾,并在該文件夾下創(chuàng)建相應(yīng)目錄。

在java相同路徑下創(chuàng)建Student類,這里不能使用@Parcelize注解,否則會(huì)報(bào)錯(cuò)

創(chuàng)建IStudentService.aidl,定義了一個(gè)接口,該接口定義了服務(wù)端提供的功能。創(chuàng)建完后rebuild一下項(xiàng)目 (每次創(chuàng)建和修改定義接口文件都要rebuild一下)

創(chuàng)建在服務(wù)端的StudentService

可以看見(jiàn)有回調(diào),說(shuō)明客戶端也提供了接口給服務(wù)端來(lái)回調(diào)(雙向通信,此時(shí)客戶端的變成了服務(wù)端),即ICallBack.aidl

客戶端是通過(guò)Binder驅(qū)動(dòng)返回的Binder調(diào)用StudentService里的具體實(shí)現(xiàn)方法

AIDL使用注意:

Messenger可以在不同進(jìn)程中傳遞 Message 對(duì)象,在Message中放入我們需要傳遞的數(shù)據(jù),就可以輕松地實(shí)現(xiàn)數(shù)據(jù)的進(jìn)程間傳遞了。Messenger 是一種輕量級(jí)的 IPC 方案,是對(duì)AIDL的封裝,底層實(shí)現(xiàn)是 AIDL。

使用詳見(jiàn):

Android ParcelFileDescriptor實(shí)現(xiàn)進(jìn)程間通信

一個(gè)通信通道,實(shí)現(xiàn)跨進(jìn)程的的Socket網(wǎng)絡(luò)通信。

具體的通信通道的圖如下。

android進(jìn)程間通信是使用Binder來(lái)傳數(shù)據(jù),而B(niǎo)inder傳輸?shù)臄?shù)據(jù),有一個(gè)最為基本的要求,就是要實(shí)現(xiàn)Parcelable接口。

ParcelFileDescriptor是android提供的一個(gè)數(shù)據(jù)結(jié)構(gòu)。

ParcelFileDescriptor是可以用于進(jìn)程間Binder通信的FileDescriptor。支持stream 寫入和stream 讀出

我們可以使用

來(lái)將PacecelFileDescriptor 與File對(duì)應(yīng)起來(lái),以實(shí)現(xiàn)進(jìn)程間的文件共享。

我們也可以使用

來(lái)建立一個(gè)pipe通信通道,ParcelFileDescriptor數(shù)組第一個(gè)元素是read端,第二個(gè)元素是write端,通過(guò)write端的AutoCloseOutputStream和read端的AutoCloseInputStream,我們就可以實(shí)現(xiàn)進(jìn)程見(jiàn)的數(shù)據(jù)流傳輸了。

發(fā)送端:

1. 業(yè)務(wù)層調(diào)用getOutputStream向通信層發(fā)起請(qǐng)求

2. 通信層通過(guò)creatPipe 建立一個(gè)ParcelFileDescriptor數(shù)組,并將write端的pipe[1]返回給業(yè)務(wù)層

3. 業(yè)務(wù)層得到pipe[1](ParcelFileDescriptor)后,可以通過(guò)AutoCloseOutputStream寫入數(shù)據(jù)

4. 從通信層的pipe[0]的AutoCloseInputStream中讀出數(shù)據(jù)通過(guò)socket發(fā)送出去

接收端:

1. 業(yè)務(wù)層調(diào)用getInputStream向通信層發(fā)起請(qǐng)求

2. 通信層通過(guò)creatPipe 建立一個(gè)ParcelFileDescriptor數(shù)組,并將read端的pipe[0]返回給業(yè)務(wù)層

3. 業(yè)務(wù)層得到pipe 0 后,可以通過(guò)AutoCloseInputStream讀取數(shù)據(jù)。(如沒(méi)有數(shù)據(jù),則阻塞,一直等到有數(shù)據(jù)為止)

4. socket中讀取數(shù)據(jù),寫入到通信層的pipe[1]的AutoCloseOutputStream。(pipe[1]一旦寫入,第三步中pipe[2]就可以讀取出數(shù)據(jù))

Binder機(jī)制概述

Android進(jìn)程間通訊是通過(guò)Binder機(jī)制來(lái)實(shí)現(xiàn)的,Android是基于linux系統(tǒng)因此有必要了解Linux系統(tǒng)進(jìn)程相關(guān)知識(shí).

Linux系統(tǒng)中(其他系統(tǒng)也是這樣)不同進(jìn)程之間不允許直接操作或訪問(wèn)另一進(jìn)程.也就是進(jìn)程隔離.

為了保證用戶進(jìn)程不能直接訪問(wèn)內(nèi)核,操作系統(tǒng)從邏輯上將虛擬空間劃分為用戶空間和內(nèi)核空間.內(nèi)核程序運(yùn)行在內(nèi)核空間(kernel space),應(yīng)用程序運(yùn)行在用戶空間(user space).為了安全,他們之間是隔離的,即使用戶程序奔潰了,也不會(huì)影響內(nèi)核.內(nèi)核空間數(shù)據(jù)是可以共享的,用戶空間不可以.

用戶空間訪問(wèn)內(nèi)核空間只能通過(guò)系統(tǒng)調(diào)用,系統(tǒng)調(diào)用是用戶空間訪問(wèn)內(nèi)核空間的唯一方式,保證所有資源訪問(wèn)在內(nèi)核控制下,避免了用戶對(duì)系統(tǒng)資源的越權(quán)訪問(wèn),提高了系統(tǒng)安全性和穩(wěn)定性.

copy_from_user:將用戶空間數(shù)據(jù)拷貝到內(nèi)核空間

copy_to_user:將內(nèi)核空間數(shù)據(jù)拷貝到用戶空間

由于用戶進(jìn)程不能直接訪問(wèn)硬件地址,所以系統(tǒng)提供了一種機(jī)制:內(nèi)存映射(Memory Map).在Linux中通過(guò)調(diào)用函數(shù)mmap實(shí)現(xiàn)內(nèi)存映射,將用戶空間一塊內(nèi)存地址映射到內(nèi)核空間.映射關(guān)系建立后,對(duì)用戶空間內(nèi)存的修改可以反應(yīng)到內(nèi)核空間.內(nèi)存映射可減少拷貝次數(shù).

如果沒(méi)有內(nèi)存映射,用戶進(jìn)程需要訪問(wèn)硬盤文件時(shí),需要在內(nèi)核空間創(chuàng)建一片頁(yè)緩存,將硬盤文件數(shù)據(jù)拷貝到頁(yè)緩存然后用戶進(jìn)程在拷貝頁(yè)緩存數(shù)據(jù),需要兩次拷貝.通過(guò)內(nèi)存映射后硬盤文件可以和內(nèi)核的虛擬內(nèi)存直接映射,減少一次拷貝.

如圖

inter-process-communication進(jìn)程間通信,指進(jìn)程間交換數(shù)據(jù)的過(guò)程.

Linux提供了很多進(jìn)程間通訊的機(jī)制,主要有管道(pipe)、消息隊(duì)列(Message)、信號(hào)(sinal)、信號(hào)量(semophore)、套接字(socket)等

內(nèi)核程序在內(nèi)核空間分配并開(kāi)辟一塊內(nèi)核緩沖區(qū),發(fā)送進(jìn)程將數(shù)據(jù)通過(guò)copy_from_user拷貝到內(nèi)核空間的數(shù)據(jù)緩沖區(qū),內(nèi)核空間通過(guò)copy_to_user將數(shù)據(jù)拷貝到接收進(jìn)程,這樣就實(shí)現(xiàn)了一次進(jìn)程間通信.如圖

Linux的IPC機(jī)制有兩個(gè)問(wèn)題:

1.數(shù)據(jù)通過(guò)用戶空間-內(nèi)核空間-用戶空間,經(jīng)過(guò)兩次拷貝,效率不高

2.接收進(jìn)程無(wú)法預(yù)先知道數(shù)據(jù)大小,只能盡可能大創(chuàng)建數(shù)據(jù)緩沖區(qū),或通過(guò)api消息頭獲取消息體的大小,浪費(fèi)了空間或時(shí)間.

Android進(jìn)程間通信通過(guò)Binder實(shí)現(xiàn),下面介紹Binder機(jī)制通信原理,為什么是Binder

內(nèi)核程序創(chuàng)建一個(gè)數(shù)據(jù)接收緩存區(qū),同時(shí)創(chuàng)建一個(gè)內(nèi)核緩沖區(qū).并建立內(nèi)核緩沖區(qū)和數(shù)據(jù)接收緩沖區(qū)內(nèi)存映射,以及數(shù)據(jù)內(nèi)核緩沖區(qū)和接收進(jìn)程用戶空間的映射關(guān)系.發(fā)送進(jìn)程通過(guò)copy_from_user將數(shù)據(jù)拷貝到內(nèi)核數(shù)據(jù)接收緩沖區(qū),因?yàn)閮?nèi)核數(shù)據(jù)接收緩沖區(qū)和內(nèi)核緩沖區(qū)以及接收進(jìn)程用戶空間存在映射關(guān)系,相當(dāng)于將數(shù)據(jù)發(fā)送到了接收進(jìn)程.完成了一次進(jìn)程間通信.如圖

Binder機(jī)制是c/s架構(gòu)的,由Client、server、ServiceManager和Binder組成.client、server和serviceManager都是獨(dú)立的進(jìn)程,由于Linux進(jìn)程隔離的原因,所以需要借助Binder進(jìn)行通信.

Binder通信主要有三個(gè)步驟:注冊(cè)服務(wù)、獲取服務(wù)、使用服務(wù).如下圖

從上一條Binder實(shí)現(xiàn)原理示例圖中可以看到,Binder可分為Java Binder、Native Binder和Kernal Binder.應(yīng)用開(kāi)發(fā)需要了解Java Binder和Navive Binder.這里只介紹Binder基本原理.具體可查看文章結(jié)尾的鏈接.

感謝

;request_id=159651217319195188353096biz_id=0utm_medium=distribute.pc_search_result.none-task-blog-2 all first_rank_ecpm_v3~rank_business_v1-1-73560642.ecpm_v3_rank_business_v1utm_term=Binderspm=1018.2118.3001.4187

Android:AIDL進(jìn)程間通信基本框架

在某些業(yè)務(wù)場(chǎng)景下,我們需要在應(yīng)用中單獨(dú)開(kāi)啟一個(gè)進(jìn)程進(jìn)行一些操作。比如性能監(jiān)控,如果讓原始業(yè)務(wù)和性能監(jiān)控本身的業(yè)務(wù)跑在同一個(gè)進(jìn)程下,那么就會(huì)導(dǎo)致性能統(tǒng)計(jì)的數(shù)據(jù)的失真。

而進(jìn)程間通信,一般采用AIDL機(jī)制的客戶端與服務(wù)端通信。

AIDL只能傳遞如下幾類數(shù)據(jù):

當(dāng)傳遞自定義 Parcelable 時(shí),有三處地方需要注意:

當(dāng)傳遞其他 aidl 接口時(shí),同樣必須要 import 這個(gè) aidl 文件

編寫完 aidl 文件后,make一下工程,會(huì)在 build 下的 generated 下的 source 下的 aidl 目錄生成對(duì)應(yīng)的接口類文件。aidl 接口其實(shí)就是 API 接口,通過(guò)實(shí)現(xiàn)對(duì)應(yīng)接口類的 Stub 子類來(lái)實(shí)現(xiàn)具體的 API 邏輯;通過(guò)對(duì)應(yīng)接口類的 Stub 子類的 asInterface 方法得到具體的實(shí)現(xiàn)類,調(diào)用具體的 API 方法。

一個(gè)基本的客戶端服務(wù)端的通信結(jié)構(gòu)一般包括如下功能

客戶端的功能

服務(wù)端的功能

客戶端的相關(guān)功能實(shí)現(xiàn)比較簡(jiǎn)單,麻煩的是服務(wù)端的功能。因?yàn)?AIDL 接口定義的都是服務(wù)端的接口,是由客戶端來(lái)調(diào)用的。而想要實(shí)現(xiàn)服務(wù)端反向調(diào)用客戶端則需要通過(guò)其他手段實(shí)現(xiàn)。

想要實(shí)現(xiàn)服務(wù)端主動(dòng)連接客戶端,最好的辦法就是 服務(wù)端發(fā)送廣播,客戶端收到廣播后再主動(dòng)連接服務(wù)端 ,通過(guò)這種方式變相地實(shí)現(xiàn)服務(wù)端主動(dòng)連接客戶端的功能

想要實(shí)現(xiàn)服務(wù)端主動(dòng)斷開(kāi)客戶端,除了上面 發(fā)送廣播是一種實(shí)現(xiàn)方式外,還可以通過(guò) android 的系統(tǒng)API RemoteCallbackList,用包名作為key值來(lái)注冊(cè)遠(yuǎn)程回調(diào)接口的方式,讓服務(wù)端持有客戶端的回調(diào)接口,服務(wù)端調(diào)用回調(diào)接口,客戶端在回調(diào)接口中實(shí)現(xiàn)主動(dòng)斷開(kāi)服務(wù)端 ,通過(guò)這種方式變量地實(shí)現(xiàn)服務(wù)端主動(dòng)斷開(kāi)客戶端的功能。而采用后者會(huì)顯得更加優(yōu)雅

既然所有的操作歸根結(jié)底都是由客戶端來(lái)完成的,那么客戶端必須得有如下的功能模塊:

服務(wù)端必須得有的功能模塊:

那么,整體的通信流程就是如下的步驟:

首先是通信的 aidl 接口定義

然后是客戶端的連接操作與斷開(kāi)連接操作,包括廣播接收者的注冊(cè)以及回調(diào)接口的實(shí)現(xiàn)

然后是客戶端的拉取數(shù)據(jù)和推送數(shù)據(jù)操作

接著是服務(wù)端的 iBinder 接口的實(shí)現(xiàn),完成回調(diào)接口的注冊(cè)、業(yè)務(wù)子線程的開(kāi)啟和關(guān)閉、數(shù)據(jù)的推送和數(shù)據(jù)的拉取操作

然后是服務(wù)端的主動(dòng)連接和主動(dòng)斷開(kāi)連接操作

最后是服務(wù)端的 onUnbind 方法的實(shí)現(xiàn),對(duì)回調(diào)接口進(jìn)行反注冊(cè)

服務(wù)端模仿 FloatViewPlugin 自定義插件,實(shí)現(xiàn) IServicePlugin 接口,定制個(gè)性化的懸浮窗插件

客戶端在 Appliaction 的 onCreate方法中初始化

在 MainActivity 上實(shí)現(xiàn)連接、斷開(kāi)、數(shù)據(jù)通信


當(dāng)前題目:android進(jìn)程間通信,android進(jìn)程間通信可以通過(guò)什么技術(shù)
本文來(lái)源:http://weahome.cn/article/dscjjec.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部