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();
    }
相关文章
相关标签/搜索