IPC 简说
IPC(inter-process communication)进程间通信
多进程分为两种情况
1. 同一个应用,使用android:process属性启动的四大组件
2. 多应用
通过android:process启动进程的方式
1. 默认:进程名为当前进程包名
2. : + 名字 :进程名为当前进程包名 + 名字 (私有进程)
3. 字符串:进程名为 字符串(全局进程)
多进程运行机制
1. 静态成员和单例模式完全失效
不同进程,虚拟机存储区域不同
2. 线程同步机制完全失效
不在同一块内存上,锁的也不是同一个对象
3. SharedPreferences可靠性下降
本质是在文件里读写,并发读写会有问题
4. Application会多次创建
IPC基础概念:主要包括Serializable [ˈsɪərɪəlaɪz]接口(连载,使连续),Parcelable['pɑːs(ə)l]接口(包裹,小包),Binder(装订工;捆缚者)
Serializable与Parcelable都是序列化接口,Serializable是java序列化话接口,使用简单,系统开销大。Parcelable是android序列化接口,使用麻烦些,但效率高。
序列化与反序列化:进程A数据序列化后,进程B反序列化成自己能用的数据,进程B数据序列化后,进程A再反序列化成自己能用的数据,达到数据共同的作用。序列化是将数据写到媒介中(文本,媒体等),反序列化是读取的过程。两边通过一定的协议达到数据共同的作用。
Binder在android中是一种跨进程的通讯方式,是客户端与服务端的通讯媒介。
可以通过AIDL来分析Binder的工作机制:
Book.java
public class Book implements Parcelable{...}
Book.aidl
package com.***.***
parcelable Book;
IBookManager.aidl
package com.***.***
interface IBookManager{...}
生成.java文件,代码分为两部分。
1. 声明一个AIDL性质的接口,只需要继承IInterface接口
public interface IBookManager extends IInterface{}
2. 实现Stub和Stub类中的Proxy代理类
public class BookManagerImpl extends Binder implements IBookManager{
private static class Proxy implements IBookManager{}
}
Binder两个很重要的方法linkToDeath和unlinkToDeath,死亡代理,客户端到服务端的Binder连接可能断开,为了不影响两端功能,Binder提供这两个方法,让Binder死亡时,可以收到消息并重新连接。
private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipitent(){
@Override
public void binderDied(){
....
mBookManager.asBinder().unlinkToDeath(mDeathRecipient, 0);
.... // 重新绑定服务
}
}
在客户端绑定服务成功后,给binder设置死亡代理
binder.linkToDeath(mDeathRecipient, 0);
Android中的IPC方式
1.使用Bundler实现IPC
ASB三大组件都可以通过intent的Bundler传值,因为Bundler实现了Parcelable接口
2.使用文件共享
通过文件共享方式是有局限性的,比如并发读、写的问题。
SharedPreferences是Android中提供的轻量级缓存方案,实际上采用xml文件来存储键值对的,系统对它有缓存策略,对高并发的读写,有很大几率会丢失数据。
3. 使用Messenger
messenger可以翻译成信使,在不同进程中传递Message对象。messenger底层是AIDL。可以像AIDL那样使用。
服务端,创建Handler对象,用它创建一个Messenger对象,在service中的onBind方法中返回这个Messenger对像的底层Binder即可。
客户端,绑定服务后,获取IBinder对象创建Messenger,通过这个Messenger就可以向服务端发送消息了。
如果需要服务端能够回复客户端,就和服务端一样,创建Handler并创建一个新的Messenger,把这个Messenger通过Message的replyTo参数传递给服务端,服务端通过这个replyTo参数就能回应客户端了。
4. 使用AIDL
值得注意的:RemoteCallbackList来存储客户端注册进来的回调接口。客户端在onDestory中去解除注册到服务端的listener,服务端竟然找不到之前注册的那个listener。系统就提供专门的容器来解决这个问题:RemoteCallbackList。
5. ContentProvider
是Android专门用来多应用间数据共享的和Messenger一样底层同样是Binder,使用上比AIDL简单多了。
自定义ContentProvider,集成ContentProvider并且实现它的六个方法onCreate,query,updatae,insert,getType。
需要配合数据库来完成数据共享
class MyContentProvider extends ContentProvider{}
...getContentResolover().query(uri,...)
6. 使用Socket

IPC 简说的更多相关文章
- unix domain IPC 进程间通信简析
Linux系统有多种进程间通信方式,如信号.消息队列.管道等,socket是其中一种,socket使用unix domain 模式进行进程间通信 //服务端代码 #include <stdio. ...
- TaintDroid剖析之IPC级污点传播
TaintDroid剖析之IPC级污点传播 作者:简行.走位@阿里聚安全 前言 在前三篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟 ...
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service ...
- System V IPC 之消息队列
消息队列和共享内存.信号量一样,同属 System V IPC 通信机制.消息队列是一系列连续排列的消息,保存在内核中,通过消息队列的引用标识符来访问.使用消息队列的好处是对每个消息指定了特定消息类型 ...
- 进程间通信IPC (InterProcess Communication)
一.进程间通信的概念 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区, ...
- Binder机制简析(三)
注册Service Service组件运行在Server进程中,首先要将Service注册到Service Manager中,再启动一个Binder线程池来等待和处理Client的通信请求. 注册过程 ...
- 极简 Node.js 入门 - 2.3 process
极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...
- Android之使用Bundle进行IPC
一.Bundle进行IPC介绍 四大组件中的三大组件(Activity.Service.Receiver)都是支持在Intent中传递Bundle数据的,由于Bundle实现了Parcelable接口 ...
- Android之使用文件进行IPC
一.文件进行IPC介绍 共享文件也是一种不错的进程间通信方式,两个进程通过读/写同一个文件来交换数据.在Windows上,一个文件如果被加了排斥锁将会导致其他线程无法对其进行访问,包括读写,而由于An ...
随机推荐
- Intel收购半导体设计公司eASIC
来源:本文由公众号 半导体行业观察(ID:icbank)翻译自「anandtech」,谢谢. 北京时间今天凌晨,Intel宣布收购了半导体设计公司eASIC. eASIC的商业模式介于传统Fables ...
- Vue的父子组件间通信及借助$emit和$on解除父子级通信的耦合度高的问题
1.父子级间通信,父类找子类非常容易,直接在子组件上加一个ref,父组件直接通过this.$refs操作子组件的数据和方法 父 这边子组件中 就完成了父 => 子组件通信 2. 子 =&g ...
- 【算法】祭奠spfa 最短路算法dijspfa
题目链接 本题解来源 其他链接 卡spfa的数据组 题解堆优化的dijkstra 题解spfa讲解 来自以上题解的图片来自常暗踏阴 使用前向星链表存图 直接用队列优化spfa struct cmp { ...
- hdu第4场j.Let Sudoku Rotate
Problem J. Let Sudoku Rotate Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Su ...
- 关于Javascript中页面动态钟表的简单实现
1.问题并不繁琐,在于HTML中 DOM(文档对象模型)方法的掌握,我的钟表实现重点用到了三个函数和一个事件 A)setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式.s ...
- zabbix3.4.7实操总结一
一.zabbix_server的配置说明 #需要修改的内容为如下:[root@localhost ~]# cd /usr/local/zabbix/etc/[root@localhost etc]# ...
- git常用命令学习笔记
安装好git之后即可使用git来管理项目了,鼠标右键点击 git bash出现命令黑窗口,接下来执行git指令即可. https://git-scm.com/book/zh/v2 以下整理了git常用 ...
- Object.create()和new object()和{}的区别
Object.create()介绍 Object.create(null) 创建的对象是一个空对象,在该对象上没有继承 Object.prototype 原型链上的属性或者方法,例如:toString ...
- 单链表ADT
本博客第一篇学术性博客,所以还是写点什么东西: 首先这篇博客以及以后的博客中的代码尽量百分之90是自己写过的: 可能有部分图片和代码是我认为别人更好的故摘抄下来, 本人三观正确,所以一定会表明来源: ...
- [模板]quicksort快速查找、排列算法
1.快速排序 //快速排序 void quick_sort(int s[], int l, int r) { if (l < r) { //Swap(s[l], s[(l + r) / 2]); ...