Android IPC 機制【1】--簡介

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();
    }
相關文章
相關標籤/搜索