1、android 中進程間通訊經常使用的有如下幾種機制java
-----------------------------------------------------------------------------------------------------------------------android
名稱 優勢 缺點 適用場景網絡
-----------------------------------------------------------------------------------------------------------------------併發
Bundle 簡單易用 只能傳輸Bundle支持的數據類型 四大組件間的進程通訊ide
-----------------------------------------------------------------------------------------------------------------------高併發
文件共享 簡單易用 不適合高併發場景,而且沒法作到 無併發訪問情形,交換簡單spa
進程間及時通訊 的數據實時性不高的場景
線程
-----------------------------------------------------------------------------------------------------------------------code
AIDL 功能強大,支持一對多併發 使用稍複雜,須要處理好線程同步 一對多通訊且有RPC需求對象
通訊,支持實時通訊
-----------------------------------------------------------------------------------------------------------------------
Messenger 功能通常,支持一對多串行 不能很好處理高併發情形,不支持 低併發的一對多即時通
通訊,支持實時通訊 RPC, 數據經過Message進行傳輸 信,無RPC需求 或者無需
只能傳輸Bundle支持的數據 類型 返回結果的RPC需求
----------------------------------------------------------------------------------------------------------------------
ContentProvider 在數據源訪問頁面功能強大, 能夠理解爲受約束的AIDL, 一對多的進程間的數據共享
支持一對多併發數據共享, 主要提 供數據源的CRUD操做
可經過Call方法擴展其餘操做
----------------------------------------------------------------------------------------------------------------------
Socket 功能強大,能夠經過網絡數 實現細節有點繁瑣 網絡數據交換
字傳輸 節流,支持一對多 ,不支持直接的RPC
併發實時通訊
---------------------------------------------------------------------------------------------------------------------
2、 Bundle
Bundle實現了Parcelable接口,因此能夠方便的在不一樣進程間傳輸,當在一個進程中啓動了另一個進程的Activity、Service、Receiver,能夠在Bundle中附加須要傳輸給遠程進程的信息並經過Intent發送出去。
3、文件共享
Activity1:----------------- private void persistToFile() { new Thread(new Runnable() { @Override public void run() { User user = new User(1, "hello world", false); File dir = new File(MyConstants.CHAPTER_2_PATH); if (!dir.exists()) { dir.mkdirs(); } File cachedFile = new File(MyConstants.CACHE_FILE_PATH); ObjectOutputStream objectOutputStream = null; try { objectOutputStream = new ObjectOutputStream( new FileOutputStream(cachedFile)); objectOutputStream.writeObject(user);//利用Serializable序列化的過程 Log.d(TAG, "persist user:" + user); } catch (IOException e) { e.printStackTrace(); } finally { MyUtils.close(objectOutputStream); } } }).start(); } Activity2:---------------- private void recoverFromFile() { new Thread(new Runnable() { @Override public void run() { User user = null; File cachedFile = new File(MyConstants.CACHE_FILE_PATH); if (cachedFile.exists()) { //對MainActivity中user對象反序列化的過程(Serializable), //獲得的是一個新的對象 ObjectInputStream objectInputStream = null; try { objectInputStream = new ObjectInputStream( new FileInputStream(cachedFile)); user = (User) objectInputStream.readObject(); Log.d(TAG, "recover user:" + user); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { MyUtils.close(objectInputStream); } } } }).start(); }