標籤:之間 交換 通訊 UI 資源 name font serial ack
一、IPC 機制介紹
IPC是Inter-Process Communication的縮寫,含義就是處理序間通訊或者跨進程通訊,是指兩個進程之間進行資料交換的過程。那麼什麼是進程,什麼是線程,進程和線程是兩個截然不同的概念。在作業系統中,線程是CPU調度的最小單元,同時線程是一種有限的系統資源。而進程指的一個執行單元,在PC和行動裝置上指的是一個程式或者一個應用。一個進程可以包含多個線程,因此進程和線程是包含被包含的關係,最簡單情況下,一個進程可以只有一個線程,即主線程,在Android裡面也叫UI線程,在UI線程裡才能操作介面元素。
1.1 Android中為什麼要開啟多進程
(1)分擔主進程的記憶體壓力。
當應用越做越大,記憶體越來越多,將一些獨立的組件放到不同的進程,它就不佔用主進程的記憶體空間了。比如在啟動一個不可見的輕量級私人進程,在後台收發訊息,或者做一些耗時的事情,或者開機啟動這個進程等。
(2)防止主進程被殺守護進程,守護進程和主進程之間相互監視,有一方被殺就重新啟動它。
1.2 如何開啟多進程
四大組件在AndroidManifest檔案中註冊的時候,有個屬性android:process這裡可以指定組件的所處的進程。預設情況下的進程名就是包名。指定為別的進程之後,系統在啟動這個組件的時候,就先建立(如果還沒建立的話)這個進程,然後再建立該組件。
擷取進程id和進程名:
String processName = ""; ActivityManager manager = (ActivityManager) getApplicationContext() .getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningAppProcessInfo process: manager.getRunningAppProcesses()) { if(process.pid == Process.myPid()) { processName = process.processName; } } Log.d(TAG, "Main: "+ Process.myTid()+" "+processName);
需要注意的是 運行在不同進程中的組件是屬於不同的虛擬機器和application。當某個應用有三個進程時則它的Application的oncreate會執行三次。
1.3 Android中開啟多進程有哪些弊端
(1)多佔了系統的記憶體空間,很容易沾滿而導致卡頓,同時也消耗使用者的電量。同時在啟動單獨進程時,進程的建立會影響繼承Application的執行個體,onCreate()會再次執行一遍。
(2)不同進程之間記憶體不能共用,最大的弊端是他們之間通訊麻煩,不能將公用資料放在Application中,堆棧資訊、檔案操作也是獨立的,如果他們之間傳遞的資料不大並且是可序列化的,可以考慮通過Bundle傳遞, 如果資料量較大,則需要通過AIDL或者檔案操作來實現。
一般在安卓中使用多進程需要注意以下問題:
- 靜態成員和單例模式完全失效
- 線程同步機制完全失效
- SharedPreferences的可靠性下降
- Application會多次建立
為瞭解決這個問題,系統提供了很多跨進程通訊方法,雖然說不能直接地共用記憶體,但是通過跨進程通訊我們還是可以實現資料互動。實現跨進程通訊的方式有很多,比如通過Intent來傳遞資料,共用檔案SharedPreference,基於Binder的Messenger和AIDL以及Socket等。
二、IPC 基礎概念
主要介紹IPC中的基礎概念,主要包括三個方面,Serializable 及 Parcelable 介面以及Binder。
2.1 Serializable 及 Parcelable 介面
參考:http://www.cnblogs.com/renqingping/archive/2012/10/25/Parcelable.html
2.2 Binder
三、Android中的IPC方式
android IPC 機制 (開發藝術探索)