標籤:
IPC:Intent-process Communication,跨進程通訊。
在一個應用程式中,可以很方便的開啟多進程。開啟進程的方式只有一種,只能在AndroidMenifest中為四大組件指定 Android:process屬性。
在非常規情況下,也可以通過JNI在native層去fork一個新的進程。
<activity android:name=".MainActivity" android:label="@string/app_name" android:process=":process" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
如上,便可開啟一個進程。也可以這樣,
android:process="hang.myapplication.process"
這兩張方案有什麼區別那?
第一種方式,“:”的含義是指要在當前的進程名上添加當前的包名,屬於當前應用的私人進程,其他應用的組件不會和它在一個進程中。
第二種方式,它是一個完整的命名方式,不會附件包名資訊,該進程是全域進程,其他應用可以通過ShareUid方式和他在同一進程。
android系統會為每個應用程式指派一個唯一的UID,具有相同UID的應用才能共用資料。
雖然開啟進程很方便,但是多進程會造成很多的問題出現,比如,記憶體無法共用資料。
開啟進程後,SecondActity無法正確MainActivity修改的值。這是因為正常情況下,兩者共用同一記憶體,由於系統在建立新的進程同時分配獨立的虛擬機器,那麼兩者連統一虛擬都不在,何況記憶體。原理如下:user類在兩個進程中是獨立存在的,並且這兩個類互不干擾。
一般來說,使用多進程會造成如下幾個方面影響:
1.靜態成員和單例模式完全失效。
2.線程同步機制完全失效。
3.SharedPreferences的可靠性下降。
4.Application會多次建立。
由於會分配信的虛擬機器,那麼也就是重新啟動一個應用,自然會建立新的Application。實現跨進程通訊的方法有很多,比如Intent,SharedPreference,Binder,以及Socket 通訊。
Android IPC通訊機制之一