標籤:
在學習Android Service組件的過程中碰到了一個問題,就是在Android應用的聲明檔案Manifest.xml中有時候會對相關的服務標籤設定一個android:process=”:remote”,這個屬性有什麼作用呢?下面筆者就將自己整理的知識和大家分享。
在Android的協助文檔中我們可以瞭解到,一般情況下一個服務沒有自己獨立的進程,它一般是作為一個線程運行於它所在的應用的進程中。但是也有例外,Android聲明檔案中的android:process屬性卻可以為任意組件包括應用指定進程,換句話說,通過在聲明檔案中設定android:process屬性,我們可以讓組件(例如Activity, Service等)和應用(Application)建立並運行於我們指定的進程中。下面是相關資料和筆者翻譯。
如果我們需要讓一個服務在一個遠端進程中運行(而不是標準的它所在的apk的進程中運行),我們可以在聲明檔案中這個服務的標籤中通過android:process屬性為其指定一個進程。
注意:這裡選擇”remote”這個名字是隨意主觀的,你能用其他名字來讓這個服務在另外的進程中運行。冒號’:’這個首碼將把這個名字附加到你的包所啟動並執行標準進程名字的後面作為新的進程名稱。
例如:一個應用的包名為com.aoyousatuo.example, 則本例中服務將啟動並執行新進程的名稱為com.aoyousatuo.example:remote.(注意,如果聲明檔案中的組件或者應用沒有指定這個屬性則預設應用和其組件將相應運行在以其包名命名的進程中).
android:process
服務所在進程的名字。通常,一個應用的所有組件都運行在系統為這個應用所建立的預設進程中。這個預設進程是用這個應用的包名來命名的。
標籤的process屬性可以設定成和所有組件都不同的預設值。但是這些組件可以通過設定自己的process值來覆寫這個預設值,這樣可以讓你的應用跨多進程運行。
如果被設定的進程名是以一個冒號開頭的,則這個新的進程對於這個應用來說是私人的,當它被需要或者這個服務需要在新進程中啟動並執行時候,這個新進程將會被建立。如果這個進程的名字是以小寫字元開頭的,則這個服務將運行在一個以這個名字命名的全域的進程中,當然前提是它有相應的許可權。這將允許在不同應用中的各種組件可以共用一個進程,從而減少資源的佔用。
例如一個應用運行在進程com.aoyousatuo.example中,android:process屬性設定為com.rabbit.man,則新的進程名字為com.rabbit.run.
android:process=":remote"屬性解說