Android程序間通訊
IPC(Inter-Process Communication)
含義為程序間通訊或跨程序通訊,是指兩個程序之間進行資料交換的過程.
說起程序間通訊,我們首先要理解什麼是程序,什麼是執行緒.
執行緒:一般指CPU排程的最小單元.
程序:一般指一個執行單元,在PC和移動裝置上指一個程式或一個應用.
那麼執行緒和程序之間有什麼關係呢?
一個程序可以包含多個執行緒,所以為包含和被包含的關係.
最簡單的情況下,一個程序中可以只有一個執行緒,即為主執行緒,在Android中也被稱為UI執行緒,並且在UI執行緒裡才能操作介面元素.
很多時候一個程序中需要執行大量耗時的任務,如果這些任務放在主執行緒中去執行就會造成介面無法響應,會嚴重影響使用者體驗,這種情況在PC系統和移動系統中都存在,在Android中被描述為ANR(Application Not Responding),即應用無響應.那麼解決該問題就會用到執行緒,將一些耗時操作放線上程中進行即可.
正常情況下,在Android中多程序是指一個應用中存在多個程序的情況,因此這裡我們暫不討論兩個應用之間的多程序情況.
開啟多程序模式:
在Android中使用多程序只有一種方法,那就是在AndroidManifest中給四大元件(Activity,Service,Receiver,ContentProvider)指定android:process屬性.除此之外沒有其他的辦法,也就是說我們無法給一個執行緒活一個實體類指定其執行時所在的程序.其實還有另一種非常規的多程序方法,那就是通過JNI在native層去fork一個新的程序,但這種方法屬於特殊情況,並不是常用的建立多程序的方式,所以我們也暫不考慮這種情況.
下面列舉一個示例描述如何在Android中建立多程序.

Paste_Image.png
該示例分別為SecondActivity和ThirdActivity指定了process屬性,並且它們的屬性值不同,這意味當前應用又增加了兩個新的程序.假設當前的應用的包名為"com.siqi.pisces",當SecondActivity啟動時,系統會為它建立一個單獨的程序,程序名為"com.siqi.pisces:second"; 當ThirdActivity啟動時,系統也會為他建立一個單獨的程序,程序名為"com.siqi.pisces.third";而同時應用的入口Activity是MainActivity,我們並沒有為他指定process屬性,那麼它執行在預設程序中,預設程序的程序名是應用的包名.

Paste_Image.png
執行程式後我們可以看見如上圖所示,程序列表中的三個程序id分別為30211、30443、30486,這說明我們的應用成功的使用了多程序技術,那麼我們可以發現開啟Android應用的多程序模式是不是很簡單呢?但這僅僅只是開始,實際的使用中還是會有很多問題需要處理的.
檢視應用程序的方法:
可以在IDE的DDMS檢視中直接檢視程序資訊,也可以使用命令列來進行檢視,命令為:adb shell ps或者 adb shell ps | grep com.siqi.pisces.
其中"com.siqi.pisces"是應用的包名.
不知道大家有沒有注意到,SecondActivity和ThirdActivity的android:process屬性分別為":second"和"com.siqi.pisces",那麼這兩種方式有區別麼?
其實是有區別的,區別有兩方面:
首先,":"的含義是指要在當前的程序名前面附加上當前的包名,這是一種簡單的寫法,對於SecondActivity來說,它的完整的程序名為"com.siqi.pisces:second",這一點通過上圖也能看出來,而對於ThirdActivity中的宣告方式,它是一種完整的命名方式,不會附加包名資訊;
其次,程序名以":"開頭的程序屬於當前應用的私有程序,其他應用的元件不可以和它跑在同一個程序中,而程序名不以":"開頭的程序屬於全域性程序,其他應用通過ShareUID方式可以和它跑在同一個程序中.
我們知道Android系統會為每個應用分配一個唯一的UID,具有相同UID的應用才能共享資料.這裡要說的是,兩個應用用過ShareUID跑在同一個程序中是有要求的,需要這兩個應用具有相同的ShareUID並且簽名相同才可以.在這種情況下,它們可以互相訪問對方的私有資料,比如data目錄,元件資訊等,不管它們是否跑在同一個程序中.當然,如果它們跑在同一個程序中,那麼除了能共享data目錄,元件資訊,還可以共享記憶體資料等等,也可以簡單的把它們想成一個應用的兩個部分.
未完待續...