Android程序間通訊:兩個應用之間如何傳值
兩個應用之間如何傳值,其實這個標題太水了,專業的說法是“兩個程序間如何傳值”,什麼?!還不夠專業,好吧,你淫了!“程序間通訊”其實更專業,這回你總滿意了吧!順帶說一下,簡寫成IPC:Inter-Process Communication。
兄弟們,如果你們從搜尋引擎或者其他途徑找到這篇文章的話,說明你的Android技術已經提升到一個很高的層次了哦,嘿嘿~為什麼這麼說呢?因為無論哪個平臺,執行緒跟程序都是絕對的重點跟難點。
本文說的程序間傳值只是程序間通訊的一個特例,還有其他用處比如,程序控制:讓一個程序殺死另一個程序之類的。當然這個不在本文討論範圍之內,大家不知道也無所謂的。
做事情要抓住重點跟難點,好比追女生,重點就是一開始不能表現出來。。。一定要以朋友的身份好好相處,等時間成熟就順利成章了。
最近確實蠻鬱悶的,一方面技術上沒有特別突破,另一方面朋友又相繼離職,搞得我上班沒勁,下班沒人玩。真慘!
廢話不多說了,開始我們的傳值旅程吧。
首先大家要知道的是,每個程序都有一段獨立的記憶體空間,所以兩個程序之間傳值本身就是效率不高,比較耗時的過程。執行緒相較於程序的優點在於共享一段記憶體,因此傳值速度比程序快,最快的當然莫過於同一個執行緒了。這些知識點是大家瞭解程式傳值的前提。
linux中程序間傳值的方式有如下幾種:
管道(pipe),訊息佇列,訊號,共享記憶體,套介面。
android中程序間的通訊方法有以下幾種:
activity,content provider,binder,service
其實android的程序間通訊是建立在linux之上的,雖然名字略有不同,但底層實現還是通過以上四種方式。
1.Activity實現兩個App之間傳值
假設有兩個應用APP1和APP2,並且想通過app1中的ActivityA中的某個按鈕或者其他控制元件的點選事件來啟動APP2中的ActivityB。步驟如下:
1.將ActivityB暴露出來
比如現在有一個LoginActivity需要暴露出來,則可以通過修改manifest來實現
<activity
android:name="com.saike.android.grape.controller.personal.LoginActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize|stateHidden" >
<intent-filter>
<action android:name="xx.com" />
<data android:scheme="value" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
如圖,上面程式碼的功能我先做個介紹:
前面幾行的我就不多說了,主要是<intent-filter>裡面那幾句,其實從名字就可以看出這個標籤的作用:用於過濾intent,那麼intent是啥,我相信也不用多說了,intent是Activity中傳值時不可忽略的類。
在將上面這段之前我們先看看我們比較熟悉的一段程式碼:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
這個屬性值的意思其實大概就類似是表示程式的“main”函式從這個activity開始。
然後在我們需要啟動這個activity的地方呼叫方法:
Intent i = new Intent("xx.com", Uri.parse("value://111"));
this.startActivity(i);