? ? ? ? 前段時(shí)間項(xiàng)目用到兩個(gè)app之間的通信尊惰,涉及到了安卓上的跨進(jìn)程通信,下面就簡(jiǎn)單寫寫我在學(xué)習(xí)這塊內(nèi)容時(shí)的認(rèn)識(shí)。
? ? ? ? 進(jìn)程間通信IPC (Inter-Process Communication)是指兩個(gè)進(jìn)程傳送數(shù)據(jù)或信號(hào),每個(gè)應(yīng)用程序其實(shí)對(duì)應(yīng)著一個(gè)進(jìn)程,都有自己的Dalvik VM實(shí)例跟獨(dú)立的內(nèi)存泌枪,兩個(gè)應(yīng)用間通信,簡(jiǎn)單的舉個(gè)例子秕岛,就像用美團(tuán)點(diǎn)外賣最后支付的時(shí)候碌燕,調(diào)用支付寶進(jìn)行支付。要實(shí)現(xiàn)進(jìn)程間通信继薛,可以通過(guò)AIDL(Android interface definition language)實(shí)現(xiàn)修壕。
? ? ? ? 兩個(gè)應(yīng)用之間通信是通過(guò)Service實(shí)現(xiàn)的,在這之前需要先了解Service與Activity之間的通信遏考,不了解的可以先去了解下什么是Service,Activity如何bind 一個(gè)Serivce跟bind成功后的回調(diào)叠殷,這里就不講基礎(chǔ)了,直接上跨進(jìn)程通信簡(jiǎn)單例子诈皿。
? ? ? ? 首先兩個(gè)app分為Service端跟Client端林束,Client端通過(guò)綁定Service端的服務(wù)來(lái)跟它進(jìn)行通信,獲取數(shù)據(jù)或者調(diào)用它的方法稽亏。
?一. Service端
我們先創(chuàng)建Service端工程ServiceTest壶冒,注冊(cè)一個(gè)Service
? ? ? ? 注意,android:enabled="true"? ?android:exported="true"這兩個(gè)千萬(wàn)不能漏截歉,添加這兩個(gè)胖腾,外部的應(yīng)用才能訪問(wèn)到Service。添加<intent-filter>的目的是后續(xù)Client設(shè)置隱性intent用到的瘪松,通過(guò)過(guò)濾其他app指定action的intent咸作,來(lái)啟動(dòng)該服務(wù)(簡(jiǎn)單的說(shuō)就是MyService可以響應(yīng)帶有com.example.administrator.servicetest.MyService這個(gè)action的Intent)。
新建UserInfo.aidl文件宵睦,添加需要的業(yè)務(wù)方法记罚,代碼如下
在makeProject后會(huì)自動(dòng)生成UserInfo.java文件,這是我們后續(xù)需要使用的類
UserInfo.java中要注意這一行壳嚎,這個(gè)Stub類繼承了Binder類并實(shí)現(xiàn)了UserInfo接口桐智,所以后續(xù)理解為把Stub當(dāng)作Binder跟UserInfo使用。
然后新建UserImpl類繼承Stub烟馅,并重寫里面的業(yè)務(wù)方法说庭,這個(gè)UserImpl就可以當(dāng)作業(yè)務(wù)對(duì)象來(lái)進(jìn)行使用了。
好了準(zhǔn)備工作完成郑趁,我們可以編輯MyService了刊驴,代碼如下,返回的bind變成了UserImpl業(yè)務(wù)對(duì)象
下面對(duì)界面進(jìn)行簡(jiǎn)單處理,編輯MainActivity的界面如下捆憎,布局文件不貼了
界面的java代碼中兩個(gè)主要代碼如下舅柜,一個(gè)綁定service,一個(gè)給Serivce里的bind對(duì)象讀取兩個(gè)EditText里的值,作為給后續(xù)Client端讀取攻礼。
二,Client端
新建工程ServiceReceiver,將Service端的aidl文件夾拷貝到Client端栗柒,需要連同包路徑一并拷過(guò)去礁扮,我的方法是直接如下圖,在工程目錄文件夾中復(fù)制文件夾拷貝到Client端工程文件夾相同路徑下瞬沦,再makeProject即可太伊。
Client端的MainActivity:兩個(gè)主要方法,創(chuàng)建一個(gè)intent逛钻,action為MyService相應(yīng)的action,設(shè)置MyService的包路徑僚焦,bind即可,在綁定成功回調(diào)中讀取MyService里的bind數(shù)據(jù)曙痘,這樣就完成了讀取Service端兩個(gè)EditText里的內(nèi)容芳悲,實(shí)現(xiàn)跨進(jìn)程通信。