Android中的进程间通信(IPC机制)

记得上次阿里电话面试就问,Android中的进程间通信有哪些?当时没怎么总结过,就只说了一个AIDL。今天就来总结总结吧。

什么是进程间通信?

顾名思义,两个进程之间进行数据交换的过程,那什么又是进程呢?

说到进程我们不得不提另一个概念:线程。按照操作系统的描述,线程是CPU调度的最小单元,同时线程是一种有限的系统资源,而进程则是一个执行单元,一个进程可以包含多个线程,也就是说,进程和线程的关系是包含与被包含关系。在我们移动设备中,进程可以理解为一个程序或者一个应用。

Android中的进程间通信:

1.一个应用因为某些原因需要采用多进程的模式来实现,eg:需要更大的内存空间,Android系统限制了一个app的内存大小

2.一个应用需要向其他应用获取或者写入数据。

我们先来说说,较少遇到的情况,一个应用的多线程运行机制:

通过设置不同的  android: process="" 的属性,可将某个Activity设置到不能的进程中。Android为每个应用(进程)分配了一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问同一个类的对象会产生多份副本。

那我们如果使用一个应用多进程实现会遇到的问题:

静态成员、单例模式和线程同步机制失效;

SharedPreferences的可靠性下降,Application会多次创建。

接下来我们就来说说Android中运用较多的两个应用(进程)之间的通信,IPC机制。

1.使用Bundle

四大组件中的 Activity 、 Service 、 Receiver都支持,在Intent中通过 Bundle 来传递数据。

Bundle 支持传递的数据类型:

Map;基本数据类型;基本数据类型数组;ArrayList ; 序列化的数据

2.使用文件共享

两个进程对同一个文件进行读写操作,从而实现进程间的通信。但是这种方式不适合高并发场景,无法做到进程间的及时通信,我们需要尽量避免并发写操作或者可以使用线程同步来限制多个线程的写操作。所以,文件共享适合对数据同步要求不高的进程间通信。(写入文件,SharedPreferences)

3.使用Messenger

Messenger通过在不同进程中传递Message对象, 在Message之中放入我们传入的数据,这样可实现进程间通信。它的底层实现是AIDL;Messenger方法也不能很好地处理高并发情形,通过串行的方式处理客户端发来的消息,如果大量的孝心同时从客户端发送到服务端,服务端需要一个一个处理,这样Messenger就不合适了。

4.AIDL

AIDL是一个IDL语言,是通过Service进行进程间的通信,下篇文章我们会详解。

5.ContentProvider

ContentProvider是Android中提供的专门用于不能应用间进行数据共享的方式,它天生就适合进程间的通信,它的底层实现是Binder,通过URI来进行我们的访问。系统预置了许多ContentProvider,比如:通讯录信息、日程表信息等等。

6.使用Socket

这相当于是通过网络来进行的进程间通信,他是通过Socket来实现,分为流式套接字和用户数据报套接字,分别应用于网络的传输控制层中的TCP和UDP协议。

时间: 2024-10-29 03:28:30

Android中的进程间通信(IPC机制)的相关文章

Android中的常见通信机制和Linux中的通信机制

Handler Handler是Android系统中的一种消息传递机制,起作用是应对多线程场景.将A进程的消息传递给B线程,实现异步消息处理.很多情况是将工作线程中需要更新UI的操作消息传递给UI主线程,而实现更新UI操作. 因为工作线程和主线程是共享地址空间,即Handler实例对象mHandler位于线程间共享的内存堆上,工作线程和主线程直接使用该对象,只需要注意多线程的同步问题.工作系统通过mHandler向其成员变量MessageQueue中添加Message,而主线程一直处于loop中

Android中的事件分发机制(下)——View的事件处理

综述 在上篇文章Android中的事件分发机制(上)--ViewGroup的事件分发中,对ViewGroup的事件分发进行了详细的分析.在文章的最后ViewGroup的dispatchTouchEvent方法调用dispatchTransformedTouchEvent方法成功将事件传递给ViewGroup的子View.并交由子View进行处理.那么现在就来分析一下子View接收到事件以后是如何处理的. View的事件处理 对于这里描述的View,它是ViewGroup的父类,并不包含任何的子元

Android 中View的绘制机制源码分析 一

尊重原创: http://blog.csdn.net/yuanzeyao/article/details/46765113 差不多半年没有写博客了,一是因为工作比较忙,二是觉得没有什么内容值得写,三是因为自己越来越懒了吧,不过最近我对Android中View的绘制机制有了一些新的认识,所以想记录下来并分享给大家.在之后的几篇博客中,我会给大家分享如下的内容: 1.View中measure(),layout(),draw()函数执行过程分析,带领大家详细分析View的尺寸测量过程,位置计算,并最终

Android 中View的绘制机制源代码分析 三

到眼下为止,measure过程已经解说完了,今天開始我们就来学习layout过程.只是在学习layout过程之前.大家有没有发现我换了编辑器,哈哈.最终下定决心从Html编辑器切换为markdown编辑器.这里之所以使用"下定决心"这个词.是由于毕竟Html编辑器使用好几年了.非常多习惯都已经养成了,要改变多年的习惯确实不易.相信这也是还有非常多人坚持使用Html编辑器的原因. 这也反应了一个现象.当人对某一事物非常熟悉时,一旦出现了新的事物想代替老的事物时,人们都有一种抵触的情绪,做

Android中TouchEvent触摸事件机制

当我们的手指在Android屏幕上点击或滑动时,就会触发触摸事件TouchEvent.在App中ViewGroup和View存在多级嵌套,在最外层的是Activity,最内层的View,介于Activity与View之间的是一些ViewGroup.本文为了简化讨论,我们假设一个Activity中只有一个ViewGroup,这个ViewGroup中只有一个View.当我们用手指触摸到View的UI时,就会产生触摸事件TouchEvent,总的过程如下图所示: 首先是最外层的Activity接收到该

Android 中View的绘制机制源码分析 三

到目前为止,measure过程已经讲解完了,今天开始我们就来学习layout过程,不过在学习layout过程之前,大家有没有发现我换了编辑器,哈哈,终于下定决心从Html编辑器切换为markdown编辑器,这里之所以使用"下定决心"这个词,是因为毕竟Html编辑器使用好几年了,很多习惯都已经养成了,要改变多年的习惯确实不易,相信这也是还有很多人坚持使用Html编辑器的原因.这也反应了一个现象,当人对某一事物非常熟悉时,一旦出现了新的事物想取代老的事物时,人们都有一种抵触的情绪,做技术的

Android中的内存管理机制以及正确的使用方式

概述 从操作系统的角度来说,内存就是一块数据存储区域,属于可被操作系统调度的资源.现代多任务(进程)的操作系统中,内存管理尤为重要,操作系统需要为每一个进程合理的分配内存资源,所以可以从两方面来理解操作系统的内存管理机制. 第一:分配机制.为每一个进程分配一个合理的内存大小,保证每一个进程能够正常的运行,不至于内存不够使用或者每个进程占用太多的内存. 第二:回收机制.在系统内存不足打的时候,需要有一个合理的回收再分配的机制,以保证新的进程可以正常运行.回收的时候就要杀死那些正在占有内存的进程,操

Android中的事件分发机制——ViewGroup的事件分发

综述 Android中的事件分发机制也就是View与ViewGroup的对事件的分发与处理.在ViewGroup的内部包含了许多View,而ViewGroup继承自View,所以ViewGroup本身也是一个View.对于事件可以通过ViewGroup下发到它的子View并交由子View进行处理,而ViewGroup本身也能够对事件做出处理.下面就来详细分析一下ViewGroup对时间的分发处理. MotionEvent 当手指接触到屏幕以后,所产生的一系列的事件中,都是由以下三种事件类型组成.

Android 中View的绘制机制源码分析 二

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/46842891 本篇文章接着上篇文章的内容来继续讨论View的绘制机制,上篇文章中我们主要讲解了View的measure过程,今天我们就来学习ViewGroup的measure过程,由于ViewGroup只是一个抽象类,所以我们需要以一个具体的布局来分析measure过程,正如我上篇文章说的,我打算使用LinearLayout为例讲解measure过程,如果你还没有读过上篇文章,那么建议你先