Android进程间通信(一) Binder的简单使用

一、为什么要进行进程间的通信?

进程通信指的是两个不同的进程之间进行数据交换的过程,这个进程和线程是两种完全不同的概念。

线程指的是CPU调度的最小单元,是一种有限的系统资源;而进程是一种执行单元,应用至少要有一个进程才可以运行(一个应用也可以有多个进程)。

众所周知,Java是在JVM中运行的,在Android中,系统会为每个进程分配一个虚拟机,不同的虚拟机在内存分配上有不同的地址空间,导致在不同虚拟机中访问同一个类的对象时会产生多份副本,而且这些副本对象都是相互独立不受其它副本对象干扰的,这就意味着,你在一个进程中对某个类的对象作出了修改,其它进程中这个类的对象是不会产生改变的。

除了不同应用之间需要进行进程间通信外,有时候一个应用本身内部也需要进行多进程的数据交换,比如应用和后台服务的数据交换。

一般来说,使用多进程会造成以下几方面问题:

1、静态成员和单例模式完全失效。如上面所描述的,一个进程中的类发生改变,对其它进程的这个类不会产生影响。

2、线程同步机制完全失效。本质上还是和第一点类似,不管是在进程中锁对象还是锁全局类,都不会对其它进程中的这个类产生影响,因为它们在不同的内存空间中。

3、SharedPreferences可靠性下降。SharedPreferences底层通过读/写XML文件来实现,如果两个进程中同时对一个ShredPreferences进行写操作,很明显是会出问题的。

4、Application会多次创建。当一个组件跑在一个新的进程中时,系统要在创建新的进程的同时分配独立的虚拟机,这个过程就是启动一个应用的过程。相当于系统又把这个应用重新启动了一遍,因此会重新创建Application。


二、IPC要解决的问题

Android进程间通信需要解决以下几个问题:

  1. 通信目标:当前进程要调用的是哪个进程及该进程的哪个方法功能
  2. 数据交换:当前进程怎么把调用目标方法所需要的参数传递给目标进程,以及如何取回处理结果
  3. 简化操作:怎么屏蔽进程间的底层通信细节,使得当前进程调用远程方法像调用本地方法一样方便

解决方案:

  1. 使用远程通信类的唯一标识符(包名+类名)确定一个进程及其服务
  2. 使用Parcelable序列化对象进行数据交换
  3. 在被调用进程(服务端)定义一个类专门用于处理跨进程请求,这个类就是Binder类



三、Binder的使用

如Messe

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值