1. 程式人生 > >Android面試篇之IPC機制[程序之間的通訊]

Android面試篇之IPC機制[程序之間的通訊]

簡介

IPC Inter-Process Communication 跨程序通訊,兩個程序之間進行資料交換的過程

在Android中的多程序一般指一個應用中存在多個程序的情況,下面討論一個應用中多程序的情況。

開啟多程序的方式

在AndroidManifest.xml檔案中,給四大元件指定android:process屬性即可,值為程序的名稱,如下

        <service
            android:name="com.katherine.du.everydaystudy.up20171214.aidl.server.BookManagerService"
            android:process=":remote">
        </service>

        <provider
            android:name=".up20171214.contentprovider.remoteprovider.BookProvider"
            android:authorities="com.katherine.du.everydaystudy.provider"
            android:process="com.katherine.du.everydaystudy.provider">
        </provider>
假設我的包名為com.katherine.du.everydaystudy,上面的BookManagerService將會執行在名為“com.katherine.du.everydaystudy:remote”的程序中,

BookProvider將會執行在“com.katherine.du.everydaystudy.provider”的程序中。

至於區別,以“:”開頭的程序屬於當前應用的私有程序,其他應用的元件不可以和它跑在同一個程序中;而不以“:”開頭的程序屬於全域性程序,其他應用通過ShareUID方式可以喝它跑在同一個程序中。

跨程序通訊方式

1. 使用Bundle

    Bundle是實現了Parcelable介面的,所以可以方便地在不同的程序間攜帶資料。Activity、Service、Receiver都支援在Intent中傳遞Bundle資料。

2. 使用檔案共享方式

    兩個程序可以通過讀寫同一個檔案進行傳遞資料,但對資料同步的處理有侷限性,且無法做到即時通訊。

3. 使用Messenger

    在不同的程序中傳遞Message物件,底層實現是AIDL,侷限性:序列處理訊息,只能通過Message的Bundle進行資料傳遞。

4. 使用AIDL

    通過AIDL實現跨程序的方法呼叫,高併發實時通訊,同樣適用於兩個應用之間。

    ●  首先建立一個Service和一個AIDL介面

    ●  建立一個類繼承自AIDL介面中的Stub類並實現Stub中的抽象方法,並在Service中的onBind方法中返回這個類的物件

    ●  最後客戶端就可以繫結服務端的Service,建立連線後即可訪問服務端的方法了

5. 使用ContentProvider

    系統預置了很多ContentProvider,如通訊錄資訊等,也可以自定義ContentProvider,只需要繼承ContentProvider並實現其中的onCreate getType insert delete update query這六個方法。通常情況下,ContentProvider以表格的形式組織資料,但也支援檔案資料,如圖片、視訊等。

6. 使用Socket套接字

    此方法同樣適用於兩個應用之間,或不同的裝置之間