读书笔记:Android中的进程间通信(一)

阅读的书籍:《Android开发艺术探索》

关键词:Android IPC简介,Android中的多进程模式

Android IPC简介:IPC是Inter-Process Communication 的缩写,也叫做进程间通信或者跨进程通信

进程间通信是指两个进程之间进行数据交换的过程,它不是Android独有的,任何一个操作系统都需要有响应的IPC机制

在 Android中最有特色的进程间通信方式就是Binder了,当然Android也支持Socket

IPC的使用场景:面对多进程时

多进程的情况分为两种:

  1. 一个应用因为某些原因自身需要采用多进程模式来实现
  2. 当前应用需要向其他应用获取数据,由于是两个应用,就必须跨进程获取所需的数据

Android中的多进程模式:通过为四大组件指定android:process属性,可以开启多进程模式

开启多进程模式

举个例子:

:remote 是一种简写的方式,这里 “  :”的含义是指在当前的进程名前面附加上当前的包名

com.ryg.chapter_2.remote  则是一种完整的命名方式,不会再附加包名信息

  • 进程名以  “  :”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,
  • 进程名不以  “  :”开头的进程则属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中
  • 当SecondActivity启动时,系统会为它创建一个单独的进程,进程名为 "com.ryg.chapter_2:remote"
  • 当ThirdActivity启动时,系统也会为它创建一个单独的进程,进程名为 "com.ryg.chapter_2.remote"

补充:Android系统会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据

多进程模式的运行机制

Android为每一个进程都分配了一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,导致在不同的虚拟机中访问同一个类的对象会产生多份副本。

案例:

SecondActivity运行在独立的进程中,新建一个UserManager类:

在MainActivity的 onCreate中把sUserId改为2,然后SecondActivity打印sUserId的值,但结果仍然是1,而不是2

原因:在一个进程中修改sUserId的值只会影响当前进程,对其他进程不会造成任何影响

得出的结论:

所有运行在不同进程中的四大组件,只要它们之间需要通过内存来共享数据,都会共享失败

 

多进程会造成如下几个方面的问题:

  1. 静态成员和单例模式完全失效
  2. 线程同步机制完全失效
  3. SharedPreferences的可靠性下降
  4. Application会多次创建

SharedPreferences不支持两个进程同时去执行写操作,因为这会导致并发读写XML文件发生一定几率的数据丢失

在多进程模式中,不同进程的组件会拥有独立的虚拟机,Application以及内存空间

 

结尾:在多进程中虽然说不能直接地共享内存,但还是可以通过跨进程通信的方式实现数据交互

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值