Android面試篇之IPC機制[程序之間的通訊]
簡介
IPC Inter-Process Communication 跨程序通訊,兩個程序之間進行資料交換的過程
在Android中的多程序一般指一個應用中存在多個程序的情況,下面討論一個應用中多程序的情況。
開啟多程序的方式
在AndroidManifest.xml檔案中,給四大元件指定android:process屬性即可,值為程序的名稱,如下
假設我的包名為com.katherine.du.everydaystudy,上面的BookManagerService將會執行在名為“com.katherine.du.everydaystudy:remote”的程序中,<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>
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套接字
此方法同樣適用於兩個應用之間,或不同的裝置之間