Android中的IPC方式(上)

本文介绍了Android中的两种IPC方式:Bundle和Messenger。Bundle通过实现Parcelable接口在不同进程间传递数据;而Messenger是轻量级的IPC方案,基于AIDL,允许服务端和客户端通过Message进行单向通信。文章详细讲解了如何使用这两种方法,并指出在并发操作时需要注意的文件共享问题以及 Messenger 的工作原理。
摘要由CSDN通过智能技术生成

以下内容摘抄自作者:任玉刚所著的《Android开发艺术探索》

简介

IPC方式其实有很多,比如在Intent中附加extras来传递信息,或者通过共享文件的方式来共享数据,还可以采用Binder方式来跨进程通信,另外ContentProvider天生就是支持跨进程访问的,还有网络通信,用Socket实现IPC,但它们在使用和侧重点上有很大区别,下面来详细逐个介绍一下。

Bundle

由于Bundle实现了Parcelable接口,所以可以很方便的在不同进程间传输。在四大组件中,Activity、Service、Receiver 这三大组件都支持在Intent中传递Bundle数据。
由于Bundle中需要添加数据,所以这些数据,必须是能够被序列化的数据,如基本类型、实现了Parcelable或Serializable接口的对象、以及一些Android支持的特殊对象,具体支持哪些类型,可以查看Bundle类源码。
如果某计算结果无法被序列化,导致在Bundle中无法添加,那么可以尝试用Bundle先向目标进程传递计算前的数据,在目标进程中再去计算结果。

使用文件共享

共享文件方式就是两个进程通过读写同一个文件数据,来实现进程间通信。
在Windows上,一个文件被加入了排斥锁,将会导致其它进程无法对其进行访问。但是由于Android基于Linux,使其读写可以并发操作且无限制,所以共享文件其实有操作风险。
在文件中,除了可以交换文本信息,也可以将对象序列化保存到文件中,然后在另一个进程中反序列化恢复这个对象。如下示例:
我们在MainActiivty的onResume()中调用如下方法:

private void persistToFile() {
   
        File file = new File("data/data/com.example.onsaveinstancestateteset/SaveFileTest.txt");
        if (!file.exists()) {
   
            try {
   
                file.createNewFile();
            } catch (IOException e) {
   
                e.printStackTrace();
            }
        }
        new Thread(new Runnable() {
   
            @Override
            public void run() {
   
                try {
   
                    FileOutputStream fileStream = new FileOutputStream(file);
                    User user = new User(1, "hello word", true);
                    ObjectOutputStream outputStream = new ObjectOutputStream(fileStream);
                    outputStream.writeObject(user);
                    fileStream.close();
                    outputStream.close();

                    Log.e("MainActivity", "user:" + user.toString());
                } catch (FileNotFoundException e) {
   
                    e.printStackTrace();
                } catch (IOException e) {
   
                    e.printStackTrace();
                }
            }
        }).start();
    }

然后在SencondActivity中的onResume()调用如下方法:

private void recoverFromFile() {
   
        new Thread(new Runnable()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

建洋你是最菜的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值