天天看點

android開發藝術探索之--IPC(跨程序通信)---多程序模式

本文是讀過 android開發藝術探索後,用于記錄知識的 再次感謝任玉剛大神出這本書。

說到IPC的使用場景就必須提到多程序,隻有面對多程序這種場景下,才需要考慮程序間通信。這個是很好了解的,如果隻有一個程序在運作,有何談多程序呢?多程序的情況分為兩種。第一種情況是一個應用因為某些原因自身需要采用多程序模式來實作,至于原因,可能有很多,比如有些子產品由于特殊原因需要運作在單獨的程序中,又或者為了加大一個應用可使用的記憶體是以需要通過多個程序來擷取多份記憶體空間。android對單個應用所使用的最大記憶體做的限制,早期的一些版本可能是16mb,不同裝置有不同的大小,另一種情況是目前應用需要向其他應用擷取資料,由于是兩個應用,是以必須采用跨程序的方式來擷取所需要的資料,甚至我們通過系統提供的contentprovider去查詢資料的時候,其實也是一種程序間通信,隻不過通信細節被系統内部屏蔽了,我們無法感覺而已,說了這麼多讓我們來看看什麼是android的多程序模式吧

android中的多程序模式

其實,給android的四大逐漸指定android:process屬性,我們可以輕易地開啟多程序模式,這看起來很簡單,但是實際使用過程中去暗藏殺機,多程序遠遠沒有沃恩想的那麼簡單,有時候我們通過多程序得到的好處設定都不足以彌補使用多程序所帶來的代碼成眠的負面影響。下面會詳細分析這些問題。

  開啟多程序模式

   正常情況下,在Android中多程序是指一個應用中存在多個程序的情況,是以這裡不讨論兩個應用之間的多程序情況,首先,在android中使用多程序隻有一種方法,那就是給四大元件(activity,service,receiver,contentprovider)在androidmenifest中指定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.dzx.androiddemo.remote">
        </activity>
           

上面代碼中我在secondActivity和ThirdActivity中加入了android:process屬性,并且他們的屬性值不同,這意味着目前應用又增加了兩個新程序。因為目前應用的包名是com.dzx.androiddemo,當secondActivity啟動時,系統會為了建立一個名稱為com.dzx.androiddemo:remote的程序,同理ThirdActivity啟動時,會建立一個名稱為com.dzx.androiddemo.remote的程序,因為mainactivity中沒有process屬性,是以mainactivity啟動時在預設程序中啟動,名稱一般為包名,接下來我們啟動這三個程序,然後列印log如下:

android開發藝術探索之--IPC(跨程式通信)---多程式模式

如上圖所示,所有程序都被開啟了。

多程序存在很多坑

  我們舉個例子,我們建立一個類UserManager,這個類中有一個pubic的靜态變量,

android開發藝術探索之--IPC(跨程式通信)---多程式模式

  然後在mainactivity的oncreate中我們把這個userid重新指派為2,列印這個靜态變量的值後再啟動secondactivity,然後在secondactivity中在列印一下suerid的值。按照正常的邏輯,靜态變量時可以在所有的地方共享的,并且一處修改處處同步,但是我們列印後發現,在secondActivity中列印的數值依然是1,這是為什麼呢,我們知道android為每一個應用配置設定了一個獨立的虛拟機,或者說為每個程序都配置設定了一個獨立的虛拟機,不同的虛拟機在記憶體配置設定上有不同的位址空間,這就導緻在不同的虛拟機中通路同一個類的對象會産生多份副本。拿我們這個例子來說,在程序com.dzx.androiddemo和程序com.dzx.androiddemo:remote中都存在一個userManager類,并且這兩個類是互不幹擾的,在一個程序中修改userid的值隻會影響目前程序,對其他程序不會造成任何影響,是以這樣我們就了解了,一般來說,使用多程序會造成如下幾方面問題:

     1.靜态成員和單例模式完全失效

     2.線程同步機制完全失效

     3.sharedpreferences的可靠性下降

     4.application會多次建立

繼續閱讀