美文网首页
Android中的IPC方式(一)

Android中的IPC方式(一)

作者: 黎明前见彩虹 | 来源:发表于2017-12-15 15:47 被阅读0次

    1. 使用Bundle

    具体用法就不说了,只是说明一个特殊情况,场景如下:
    A进程正在进行一个计算,计算完成后在启动B进程的一个组件并吧计算结果传给B进程。可是这个计算结果不支持放入Bundle中,因此无法通过 Intent 来传输。这个时候如果我们用其他的 IPC 方式就会略显复杂。我们可以这样处理:
    我们通过 Intent 启动进程B的一个Service组件,让Service在后台进行计算,计算完毕后在启动B进程正好启动的目标组件,由于Service也运行在B进程中,所以目标组件就可以获取计算结果,这样依赖就轻松解决了跨进程的问题。

    2. 使用文件共享

    文件共享也是一种不错的进程间通信,两个进程通过读/写同一个文件来交换数据。比如A进程把数据写入文件,B进程读取这个文件来获取数据,当然,了解系统的人或许知道在Windows上,一个文件如果被加了排斥锁,那么其他的进程将不能访问这个文件,也包括读和写,而Android基于Linux,使得其并发读/写没有限制的进行,甚至两个进程同时对一个文件进行写操作也是允许的,索然这个可能会出问题。通过文件交换数据很好使用,除了交换一些文本信息外,我们还可以序列化一个对象到文件系统中的同时从另外一个进程中恢复这个对象。来看个例子:
    第一个Activity的onResume方法中

    private void persistToFile() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    User user = new User(1, "小明", false);
                    File dir = new File(path);
                    if(dir.exists()) {
                        dir.mkdirs();
                    }
                    File createFile = new File(uri);
                    ObjectOutputStream objectOutputStream = null;
                    try {
                        objectOutputStream = new ObjectOutputStream(createFile);
                        objectOutputStream.writeObject(user);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
            }).start();
        }
    

    第二个Activity的onResume方法中

    private void recoverFromFile() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    User user = null;
                    File createFile = new File(uri);
                    if (createFile.exists()) {
                        ObjectInputStream objectInputStream = null;
                        try {
                            objectInputStream = new ObjectInputStream(new FileInputStream(createFile));
                            user = objectInputStream.readObject();
                        } catch (IOException e) {
                            e.printStackTrace();
                        } catch (ClassNotFoundException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
        }
    
    PS:我没有写关闭IO流,读者朋友写的时候别忘记了

    打印log日志发现,获取的数据就是之前我们存储的数据,内容是一样的。

    当然文件共享也是有弊端的,我们上边也已经说过了,如果是并发读/写的时候,我们读出来的内容有可能就不是最新的,如果是并发写那就更严重了。所以我们要避免这些情况的发生或者考虑使用同步来限制多个进程的写操作,通过上边的分析,我们会发现,文件共享适合在对数据同步要求不高的进程之间通信,并且要处理好并发读/写的情况。

    3. 使用SharedPreferences

    当然,对于SharedPreferences来说,SharedPreferences是个特例,众所周知,SharedPreferences是Android中提供的轻量级存储方案,他通过键值对的方式来存储数据,在底层实现上他采用XML文件来存储键值对,每个引用的SharedPreferences文件都可以在当前包所在的data目录下查看到,一般来说他位于data/data/packageName/shared_prefs目录下,齐总packageName表示当前应用的包名,从本质上来说,SharedPreferences也属于文件的一种,但是由于系统对他的读/写有一定的缓存策略,即在内存中有一份SharedPreferences文件的缓存,因此多进程模式下,系统对他的读/写就变得不可靠,当面对高并发读/写访问,SharedPreferences有很大的几率会丢失数据,因此不建议在进程间通信中使用SharedPreferences。

    相关文章

      网友评论

          本文标题:Android中的IPC方式(一)

          本文链接:https://www.haomeiwen.com/subject/hiffbxtx.html