一、概念 1. ipc (Inter-PRocess Communication,進程間通信); 2. 線程 CPU調度的最小單元,線程是一種有限的系統資源; 3. 進程 一個執行單元 ,一個進程可以包含多個線程。 二、android 中的多進程模式 1. 通過給四大組件指定 android:process屬性,就可以開啟多進程模式。
<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SecondActivity" android:process=":remote" /> <activity android:name=".ThirdActivity" android:process="com.example.mac.processdemo.remote" /> </application>兩種方式的區別:
(1).“ : ”是指在當前的進程名前面附加上當前的報名,對于ThirdActivity中的聲明方式,它是一種完整的命名方式,不會附加包名信息。 (2).“ : ”開頭的進程屬于當前應用的私有進程,其他應用的組件不可以和它跑在同一個進程中;而進程名不以“ :”開頭的進程屬于全局進程 ,其它應用通過ShareUID方式和它跑在同一個進程中。
Android系統為每個應用分配一個唯一的UID,具有相同UID的應用才能共享數據。兩個應用通過ShareUID跑在同一個進程中是有要求的,需要這兩個應用有相同的ShareUID并且簽名相同才可以。在這種情況下,它們可以互相訪問對方的私有數據,比如data目錄,組件信息等。
2.多進程模式的運行機制
SecondActivity運行在一個單獨的進程中,Android為每一個應用程序分配了一個獨立的虛擬機,或者說為每個進程都分配了一個獨立的虛擬機,不同的虛擬機在內存分配上 有不同的地址空間,這就會導致在不同的虛擬機中訪問同一類的對象會產生多份副本。在一個進程中修改某個值只會影響當前進程,對其他進程不會造成任何影響。
所有運行在不同進程中的四大組件,只要它們之間如要通過內存來共享數據,都會失敗,這也是多進程所帶來的主要影響。
一般來說,使用多進程會造成如下幾方面的問題:
(1)靜態成員和單例模式完全失效 (2)線程同步機制完全失效 (3)SharedPreferences 的可靠性下降 (4)Application會多次創建(可以這么理解:運行在同一個進程中的組件是屬于同一個虛擬機和同一個Application的,運行在不同進程中的組件是屬于兩個不同的虛擬機和Application的) 1,2,3 因為為每個進程分配不容虛擬機造成的。 三、Android中實現IPC方式 1.使用Bundle —-> 用于android四大組件間的進程間通信 android的四大組件都可使用Bundle傳遞數據 所以如果要實現四大組件間的進程間通信 完全可以使用Bundle來實現 簡單方便
2.使用文件共享 —->用于單線程讀寫 這種方式在單線程讀寫的時候比較好用 如果有多個線程并發讀寫的話需要限制線程的同步讀寫 另外 SharePreference是個特例 它底層基于xml實現 但是系統對它的讀寫會基于緩存,也就是說再多進程模式下就變得不那么可靠了,有很大幾率丟失數據
3.使用Messenger —->用于可存放在message中的數據的傳遞 使用這個方式可以在不同進程間傳遞message對象 這是一種輕量級的IPC方案 當傳遞的對象可以放入message中時 可以考慮用這種方式 但是msg.object最好不要放 因為不一定可以序列化
4.AIDL android 接口定義語言 —->主要用于調用遠程服務的方法的情況 還可以注冊接口 (暫時未看) 5.ContentProvider方式 6.Socket方法實現Ipc 這種方式也可以實現 但是不常用 需要權限
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.access_NETWORK_STATE" />最后 總結IPC通信方式
新聞熱點
疑難解答