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 简说的更多相关文章

  1. unix domain IPC 进程间通信简析

    Linux系统有多种进程间通信方式,如信号.消息队列.管道等,socket是其中一种,socket使用unix domain 模式进行进程间通信 //服务端代码 #include <stdio. ...

  2. TaintDroid剖析之IPC级污点传播

    TaintDroid剖析之IPC级污点传播 作者:简行.走位@阿里聚安全 前言 在前三篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟 ...

  3. 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service ...

  4. System V IPC 之消息队列

    消息队列和共享内存.信号量一样,同属 System V IPC 通信机制.消息队列是一系列连续排列的消息,保存在内核中,通过消息队列的引用标识符来访问.使用消息队列的好处是对每个消息指定了特定消息类型 ...

  5. 进程间通信IPC (InterProcess Communication)

    一.进程间通信的概念 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区, ...

  6. Binder机制简析(三)

    注册Service Service组件运行在Server进程中,首先要将Service注册到Service Manager中,再启动一个Binder线程池来等待和处理Client的通信请求. 注册过程 ...

  7. 极简 Node.js 入门 - 2.3 process

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  8. Android之使用Bundle进行IPC

    一.Bundle进行IPC介绍 四大组件中的三大组件(Activity.Service.Receiver)都是支持在Intent中传递Bundle数据的,由于Bundle实现了Parcelable接口 ...

  9. Android之使用文件进行IPC

    一.文件进行IPC介绍 共享文件也是一种不错的进程间通信方式,两个进程通过读/写同一个文件来交换数据.在Windows上,一个文件如果被加了排斥锁将会导致其他线程无法对其进行访问,包括读写,而由于An ...

随机推荐

  1. nginx 和 tp兼容pathinfo和rewrite两种url访问方式

    环境:centos7,yum安装的nginx1.10.php-fpm,tp3.2 本方法只需要配置nginx.conf的一个文件就可以支持pathinfo和rewrite两种url访问方式 vim / ...

  2. 交换机telnet配置

    新开箱交换机开机配置Telnet需要三个步骤: 1.开启telnet是能:系统视图模式下输入命令: telnet server enable #开启telnet功能# 2.Telnet创建账号:aaa ...

  3. .Net mvc 上传多文件

    .net mvc 上传多文件有很多种方式,我的方法只是其中一种, 仅供参考,我主要是注重参数传递的过程,后面文件保存的地方省略.. 调试环境 vs2017 控制器代码: [HttpPost] publ ...

  4. win10释放的wifi热点手机连不上

    直入正题吧…… 在win10的搜索框里输入ser,找到“windows服务”选项,点击进入,如下图 找到下图所示的两个服务,然后,右键,属性,启动类型改为自动,然后点确定,确定完以后,再右键,点启动, ...

  5. 微信和QQ内置浏览器为什么老是弹停止访问该网页,微信域名被屏蔽的解决办法

    近来很多商家开始重视域名防封的技术了,为什么呢,因为实在是封怕了.三天两头就得去换域名,换域名是小事,用户流失就是大事了,直接跟利益挂钩的.那么域名防封技术究竟有多重要呢?又该如何实现域名防封呢?下面 ...

  6. 新建项目找不到android studio:appcompat v7:27.+包。

    1.我们在build.gradle(project)中添加maven中的google库: allprojects { repositories { jcenter() maven { url &quo ...

  7. linux—epoll

    一.epoll服务端实现中需要的3个函数: epoll_create:创建保存epoll文件描述符的空间. epoll_ctl:向空间注册并注销文件描述符. epoll_wait:与select函数类 ...

  8. Spring Websocket实现简易在线聊天功能

    针对Spring Websocket的实现,我参照了其他博主的文章https://www.cnblogs.com/leechenxiang/p/5306372.html 下面直接给出实现: 一.引入相 ...

  9. lr_java user协议脚本开发

    1.准备工作,安装jdk,配置环境变量 lr11 jdk1.6 32位 lr12 jdk1.7 32位 注:若原已安装了jdk1.8,现要安装jdk1.7,若遇到安装好1.7并配置好环境后,在cmd中 ...

  10. Jeecg

    姓名:黄于霞          班级:软件151 1.第一步将Jeecg引包到javaEE中,如图下图所示: 2.第二步改jeecg_config.properties中的用户名和密码改成和数据库中一 ...