1. 程式人生 > >Android程序間通訊:兩個應用之間如何傳值

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>  

這個對我們來說再熟悉不過了,因為我們在寫任何一個應用的時候都要指明啟動應用的activity,此時必須要使用標籤action,並賦值他的屬性android:name 為 android.intent.action.main

這個屬性值的意思其實大概就類似是表示程式的“main”函式從這個activity開始。

然後在我們需要啟動這個activity的地方呼叫方法:

Intent i =  new Intent("xx.com", Uri.parse("value://111"));  
this.startActivity(i); 

即可。