除了在DDMS中可以查看進程,我們還可以通過shell命令來查看

不知道讀者有沒有注意到,SecondActivity和ThirdActivity的進程名分別爲“:remote”和包名.remote,那麼這兩種方式有區別嗎?其實是有區別的,區別在兩面,首先”:“的含義,是指在當前的進程名前附加上包名,這是一種簡寫的方法,對於SecondActivity來說,他完整的進程名爲com.liuguilin.multiprocesssample:remote,而對於ThirdActivity中的申明方式,它是一種完整的命名方式,不會附加包名信息;其次,進程以”:“開頭的屬於當前應用的私有進程,其他應用的組件不可以和它跑在同一個進程中,而進程名不以”:“開頭的進程屬於全局進程,其他應用通過ShareUID方式可以和它跑在同一進程中。

我們知道Android系統會爲每個應用分配一個唯一的UID,具有相同UID的應用才能共享數據。這裏要說明的是,兩個應用通過ShareUID跑在同一個進程由是有要求的,需要這兩個應用有相同的ShareUID並且簽名相同纔可以。在這種情況下,它們可以互相訪問對方的私有數據,比如data目錄、組件信息等,不管它們是否跑在同一個進程中。當然它們跑在同一個進程中,那麼除了能共享data目錄、組件信息,還可以共享內存數據,或者說它們看起來就像是一個應用的兩個部分。

如果用一句話來形容多進程,那筆者只能這樣說:“當應用開啓了多進程以後,各種奇怪的現象都出現了”,爲什麼這麼說呢?這是有原因的。大部分人都認爲開啓多進程是很簡單的事情,只需要給四大組件指定android:process屬性即可。比如說在實際的產品開發中,可能會有多進程的需求,需要把某些組件放在單獨的進程中去運行,很多人都會覺得這不很簡單嗎?然後迅速地給那些組件指定了android:process屬性,然後編譯運行,發現“正常地運行起來了”。這裏筆者想說的是,那是真的正常地運行起來了嗎?現在先不置可否,下面先給舉個例子,然後引入本節的話題。還是本章剛開始說的那個例子,其中SecondActvity通過指定android:process屬性從而使其運行在一個獨立的進程中,這裏做了一些改動,我們新建了一個類,叫做UserManager,這個類中有一個public的靜態成員變量,如下所示。

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