第2章 IPC机制

开启多进程和负面影响

IPC:进程间通讯。

线程与进程是包含的关系。

使用只有1个方法:给四大组件在manifest里指定android:process属性,无法给一个线程或者实体类指定其运行时所在的进程。

  1. android:process=":remote"

进程名以":"开头的进程属于私有进程,其他应用的组件不可以和它跑早同一个进程中,而进程名不以":"开头的属于全局进程,

其他应用可以通过ShareUID方式可以和它跑在同一个进程中。

UID:每个应用分配唯一的UID,两个相同UID签名相同可以共享数据。

多线程的负面影响:

1、静态成员和单例模式完全失效(通过内存来共享数据都会失败);

2、线程同步机制完全失效;

3、SharedPreferences可靠性下降(内存中只有一份SharedPreferences);

4、Application会多次创建;

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

IPC基础

Serializable:

Java提供的序列化接口

用的时候用类实现Serializable并在接口里面声明

  1. private static final long serialVersionUID = 51989342343L;

对象的序列化和反序列化使用ObjectOutputStream和ObjectInputStream。手动指定serialVersionUID可以很大程度避免反序列化失败。

Parcelable:
Android提供推荐的新的序列化接口,效率高。

  1. public class User implements Parcelable, Serializable {
  2. private static final long serialVersionUID = 519067123721295773L;
  3. public int userId;
  4. public String userName;
  5. public boolean isMale;
  6. public Book book;
  7. public User() {
  8. }
  9. public User(int userId, String userName, boolean isMale) {
  10. this.userId = userId;
  11. this.userName = userName;
  12. this.isMale = isMale;
  13. }
  14. //返回当前对象的内容描述
  15. public int describeContents() {
  16. return 0;
  17. }
  18. //序列化
  19. public void writeToParcel(Parcel out, int flags) {
  20. out.writeInt(userId);
  21. out.writeString(userName);
  22. out.writeInt(isMale ? 1 : 0);
  23. out.writeParcelable(book, 0);
  24. }
  25. public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {
  26. //从系列化后的对象中创建原始对象
  27. public User createFromParcel(Parcel in) {
  28. return new User(in);
  29. }
  30. //创建指定长度的原始对象数组
  31. public User[] newArray(int size) {
  32. return new User[size];
  33. }
  34. };
  35. //反序列化
  36. private User(Parcel in) {
  37. userId = in.readInt();
  38. userName = in.readString();
  39. isMale = in.readInt() == 1;
  40. book = in.readParcelable(Thread.currentThread().getContextClassLoader());
  41. }
  42. @Override
  43. public String toString() {
  44. return String.format(
  45. "User:{userId:%s, userName:%s, isMale:%s}, with child:{%s}",
  46. userId, userName, isMale, book);
  47. }
  48. }

Binder:

IPC角度:Android中的一种跨进程通讯方式;

Android Framework角度:ServiceManager连接各种Manager和相应ManagerService的桥梁;

Android应用层:客户端和服务端进行通讯的媒介,当bindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象,通过这个Binder对象,客户端可以

获取服务端的数据和服务(包含普通服务和基于AIDL服务)。

实现了IBinder接口,在android开发中主要用在Service中,包括AIDL和Messenger,普通servece中Binder不涉及进程间通讯,Messenger底层是AIDL。

AIDL的本质是系统为我们提供了一种快速实现Binder的工具。

Binder的两个重要方法linkToDeath和unlinkToDeath,当Binder死亡时会收到通知。

IPC实现方式

Intent中附加extra(传递Bundle数据),ContentProvider、文件SD卡共享(适合在对数据同步要求不高的进程之间进行通讯)、Binder、网络通讯(Socket)、AIDL

Messenger:数据传输必须将数据放入Message中,Messenger和Message都实现了Parcelable接口,串行处理。

AIDL:Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。

AIDL中会大量使用到Parcelable来序列化对象。

如果AIDL中用到了自定义的Parcelable对象,必须建立个和他同名的AIDL文件。

AIDL流程:创建一个Service和一个AIDL接口,接着创建一个类继承自AIDL接口中的Stub类并实现Stub中的抽象方法,在Service的onBind方法中返回这个类的

对象,然后客户端就可以绑定服务端Service,建立连接后就可以访问远程服务端的方法。

Socket:不仅可以实现进程间通讯,还可以实现设备间通讯,前提是设备之间的IP可见;

ContentProvider:天生适合进程间通讯,底层Binder

Binder连接池

BinderPool:将每个业务模块的Binder请求统一转发到远程Service中去执行;

能够极大提高AIDL的开发效率,并可避免大量Service的创建。


来自为知笔记(Wiz)

时间: 2024-08-09 04:54:24

第2章 IPC机制的相关文章

Android开发艺术-第二章 IPC 机制

2.1 Android IPC 简介 IPC 意为进程间通信或者跨进程通信,线程是 CPU 调度的最小单元,是一种有限的系统资源.进程一般指一个执行单元.任何操作系统都需要相应的 IPC 机制.如 Windows 上可以通过剪切板 管道 和邮槽来进行:Linux 上可以通过命名管道 共享内容 信号量等来进行.在 Android 中最有特色的进程间通信方式就是 Binder 了,同时也支持 Socket 实现任意两个终端之间的通信. 2.2 Android 中的多进程模式 (1) 通过给四大组件指

Android开发艺术探索——第二章:IPC机制(上)

Android开发艺术探索--第二章:IPC机制(上) 本章主要讲解Android的IPC机制,首先介绍Android中的多进程概念以及多进程开发模式中常见的注意事项,接着介绍Android中的序列化机制和Binder,然后详细的介绍Bundle,文件共享,AIDL,Messenger,ContentProvider和Socker等进程间通讯的方法,为了更好的使用AIDL进行进程间通讯,本章引入了Binder连接池的概念,最后,本章讲解各种进程间通信方式的优缺点和使用场景,通过本章,可以让读者对

Android艺术开发探索——第二章:IPC机制(下)

Android艺术开发探索--第二章:IPC机制(下) 我们继续来讲IPC机制,在本篇中你将会学习到 ContentProvider Socket Binder连接池 一.使用ContentProvider ContentProvider是Android中提供的专门用来不同应用之间数据共享的方式,从这一点来看,他天生就是适合进程间通信,和Messenger一样,ContentProvider的底层实现同样也是Binder,由此可见,Binder在Android系统中是何等的重要,虽然Conten

Android开发艺术探索——第二章:IPC机制(中)

Android开发艺术探索--第二章:IPC机制(中) 好的,我们继续来了解IPC机制,在上篇我们可能就是把理论的知识写完了,然后现在基本上是可以实战了. 一.Android中的IPC方式 本节我们开始详细的分析各中跨进程的方式,具体方式有很多,比如可以通过在Intent中附加extras来传递消息,或者通过共享文件的方式来共享数据,还可以采用Binder方式来跨进程通信,另外,ContentProvider天生就是支持扩进程访问的,所以通过Socket也可以实现IPC,上述的各种方法都能实现I

第二章——第二节 IPC机制的概述和使用

一.Serialiable与Paracle ①.作用    ②.使用 二.Binder与AIDL ①.各自的作用 三.如何使用IPC机制 四.IPC机制的原理 ①.流程图  ②.自己编译自动生成的Aidl代码 回答: Serialiable的使用 步骤:1.创建类并继承Serializable接口  2.将对象序列化到文件中 3.从文件中获取序列化的文件 详细步骤: 1.创建Book类,并继承Serializable,编写serialVersionUID降低反序列化失败的概率 public cl

Android IPC机制(三):浅谈Binder的使用

一.前言 在上一篇博客Android IPC机制(二):AIDL的基本用法中,笔者讲述了安卓进程间通讯的一个主要方式.利用AIDL进行通讯.并介绍了AIDL的基本用法. 事实上AIDL方式利用了Binder来进行跨进程通讯.Binder是Android中的一种跨进程通讯方式.其底层实现原理比較复杂.限于笔者水平,不能展开详谈.所以这篇文章主要谈谈以AIDL为例,谈谈Binder的用法. 二.原理 上一篇文章中创建了一个IMyAidl.aidl文件,即接口文件,随即编译了该文件.生成了一个.jav

pipe()管道最基本的IPC机制

<h4>进程间通信 fork pipe pie_t 等用法(管道机制 通信)</h4>每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲 区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication).如下图所示. <a href="http://www.emacsvi.co

ndk学习15: IPC机制

Linux IPC机制 来自为知笔记(Wiz)

为什么Android要采用Binder作为IPC机制?

作者:Gityuan链接:https://www.zhihu.com/question/39440766/answer/89210950来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 在开始回答 前,先简单概括性地说说Linux现有的所有进程间IPC方式: 1. 管道:在创建时分配一个page大小的内存,缓存区大小比较有限:2. 消息队列:信息复制两次,额外的CPU消耗:不合适频繁或信息量大的通信:3. 共享内存:无须复制,共享缓冲区直接付附加到进程虚拟地址空间,