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目錄,組件信息,還可以共享內存數據等等,也可以簡單的把它們想成一個應用的兩個部分.

未完待續...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章