Android开发高级进阶——多进程间通信

如果一个进程占用内存超过了这个内存限制,就会报OOM的问题,很多涉及到大图片的频繁操作或者需要读取一大段数据在内存中使用时,很容易报OOM的问题。为了彻底地解决应用内存的问题,Android引入了多进程的概念,它允许在同一个应用内,为了分担主进程的压力,将占用内存的某些页面单独开一个进程,比如Flash、视频播放页面,频繁绘制的页面等。

进程的特点:

进程是系统资源和分配的基本单位,而线程是调度的基本单位。
每个进程都有自己独立的资源和内存空间
其它进程不能任意访问当前进程的内存和资源
系统给每个进程分配的内存会有限制

那么一个进程能分配多少内存?

private void getMaxMemoryInfo(){
       Runtime rt = Runtime.getRuntime();
       long maxMemory = rt.maxMemory();
       Log.e("MaxMemory:", Long.toString(maxMemory/(1024*1024)));
       ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
       Log.e("MemoryClass:", Long.toString(activityManager.getMemoryClass()));
       Log.e("LargeMemoryClass:", Long.toString(activityManager.getLargeMemoryClass()));
   }

06-06 15:27:22.740 11917-11917/com.suning.myapp E/MaxMemory:: 192
06-06 15:27:22.740 11917-11917/com.suning.myapp E/MemoryClass:: 192
06-06 15:27:22.740 11917-11917/com.suning.myapp E/LargeMemoryClass:: 512

可以看到一般的应用,最大分配内存是192M内存。
可以看到,设置largeHeap为true时, 通过rt.maxMemory();获取的值为512M。

Android的进程分类

1.前台进程 : 该进程包含正在与用户进行交互的界面组件,比如一个Activity

2.可见进程:可见进程指部分程序界面能够被用户看见,却不在前台与用户交互

3后台进程

如果一个进程不包含任何已经启动的服务,而且没有用户可见的Activity,则这个进程就是后台进程。(播放音乐,正在上传图片的进程)

4.空进程

空进程是不包含任何活跃组件的进程。在系统资源紧张时会被首先清除。

ANDROID 中UID与PID的作用与区别

PID:PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID
UID:Android给每个APK进程分配一个单独的空间,manifest中的userid就是对应一个分配的Linux用户ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者其他应用程序影响它)。用户ID 在应用程序安装到设备中时被分配,并且在这个设备中保持它的永久性。

通常,不同的APK会具有不同的userId,因此运行时属于不同的进程中,而不同进程中的资源是不共享的,在保障了程序运行的稳定。然后在有些时候,我们自己开发了多个APK并且需要他们之间互相共享资源,那么就需要通过设置shareUserId来实现这一目的。

通过Shared User id,(同个签名)拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件(\data\data\自定义的package\ 路径下的互相访问).就像访问本程序的数据一样。

设置shareUserId


为什么要使用多进程

多进程,只有面对多进程这种场景下,才需要考虑多进程通信,这是很好理解的。至于一个应用使用多进程的原因,这个可能很多,辟如有些模块由于特殊原因需要运行在独立的进程;又或者为了加大一个应用可使用的内存,通过多进程的方式申请多份内存空间。还有一个情况需要使用IPC,那就是多个应用之间进行数据共享,使用ContentProvider去查询数据时也是一种进程通讯,只是对我们来说透明化了,无法感知到。

解决多进程问题 ? IPC 概念来了

字面意思就是进程间通信或者跨进程通信.
Android 基于 Linux,而 Linux 出于安全考虑,不同进程间不能之间操作对方的数据,这叫做“进程隔离”。

  • IPC是一种用于多进程间数据信号交换的框架;
  • IPC方式包括信息传递,数据同步,共享内存和远程过程调用等;

Android提供的进程间的通信

1.文件
2.AIDL
3.Binder
4.Messenger
5.ContentProvider
6.Socket

捕获8.PNG

这里再对比总结一下:

  • 只有允许不同应用的客户端用 IPC 方式调用远程方法,并且想要在服务中处理多线程时,才有必要使用 AIDL
  • 如果需要调用远程方法,但不需要处理并发 IPC,就应该通过实现一个 Binder 创建接口
  • 如果您想执行 IPC,但只是传递数据,不涉及方法调用,也不需要高并发,就使用 Messenger 来实现接口
  • 如果需要处理一对多的进程间数据共享(主要是数据的 CRUD),就使用 ContentProvider
  • 如果要实现一对多的并发实时通信,就使用 Socket

你可能感兴趣的:(Android开发高级进阶——多进程间通信)