Android IPC | Android多进程模式

前 言

关于Android的进程间通信(即IPC)有很多种方式,比如我们常用的AIDL、Socket等,而其中最重要而且最需要掌握的就是AIDL的使用和原理,简单来说它是通过Binder实现的。

关于Binder的知识点非常多,当我们阅读一些系统源码时,如果不了解Binder的话,就难以读懂不同进程之间的合作和通信,可以说是Binder实现的IPC方式是整个Android系统不同进程通信的核心

Android IPC 简介

IPC就是Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信,何为通信也就是俩个进程之间进行数据交换的过程。

进程和线程

既然说到跨进程通信,那什么是进程,进程和线程是完全不同的概念。按照操作系统的描述,线程是CPU调度的最小单元,同时线程是一种有限的系统资源。

这里或许有刚入门的同学不理解什么是CPU调度的最小单元这句话,我们直接看一张图:

图片

由于CPU数量有限且运行速度非常快,所以可以多个线程同时给一个CPU来执行,由于不断的切换,看起来线程就跟一直在运行一样。

而进程一般指的是一个执行单元,比如在PC和移动设备中,一般指的就是一个应用。而且一个进程可以包含多个线程,所以进程和线程是包含与被包含的关系。

Android IPC方式

当然不仅仅是Android系统,任何一个系统都需要相应的IPC机制。比如Windows上可以通过剪贴板、管道等来实现进程间通信;而Linux可以通过管道、信号量来实现进程间通信,可以看到不同的系统有不同的IPC方式。

而Android系统作为基于Linux内核的操作系统,它的通信方式并没有完全继承Linux,而是创建了一个特殊的通信方式:Binder,通过Binder可以轻松实现通信;关于Binder的内容,后面文章会花很大篇幅仔细介绍,除了Binder就还有Socket也可以实现任意俩个终端之间的通信

多进程的优势

在Android中需要IPC有俩种情况,一种是多个APP之间通信,这种需求场景在定制系统中比较多,比如车机、电视、手机系统,经常就有Launcher应用需要得到其他应用比如导航、音乐应用的信息并且展示出来;

还有一种就是一个APP也可以开启多进程,而这种在比较大型的APP中使用的非常多,比如下图:

图片

这里发现QQ、微信、知乎等都有多个进程在运行,那为什么一个APP要设置多进程呢,大概有如下几个原因:

  1. 突破进程内存限制。Android系统会为每个应用分配一定的内存,但是有些功能十分消耗内存,比如查看图片这种功能,这时为了防止该功能导致应用内存过多导致OOM,可以把该功能单独拎出来,在单独进程中进行,这样就可以获取双份内存,突破了单一应用的内存限制。

  2. 功能稳定性,独立的通信进程保持长连接的稳定性。比如各个手机应用的推送功能,一般都会单独开启一个进程,来保证其稳定性。

  3. 避免内存泄漏。这里比较常见的做法就是把WebView单独放到一个进程中给隔离起来,避免WebView发生内存泄漏导致APP主进程内存泄漏。

  4. 隔离风险。对于不稳定的功能可以放入独立进程,这样可以避免不稳定的功能发生崩溃导致主APP也崩溃。

Android 多进程模式

对于多个APP而言,之间的数据天生就是不共享的,因为进程隔离。而对于单一APP来说,开启多进程的方式也只有一个,而且非常方便。

开启多进程

应用开启多进程的方法有且仅有一个就是在Manifest中设置四大组件的process属性即可,如下所示:

<activity    android:name=".ThirdActivity"    android:exported="false"    android:process="com.zyh.ipc.process2"    /><activity    android:name=".SecondActivity"    android:exported="false"    android:process=":process1"    />

其中对SecondActivity设置的process值为":process1",而对ThirdActivity设置的值是全名,上述APP在设置后,运行结果如下:

图片

可以发现这里多了俩个进程信息。

这里可以注意到设置process的方式是不一样的,其中以:process1设置的进程属于当前应用的私有进程,其他应用组件不可以和它跑在一个进程中;而以全包名的方式设置进程,则是属于全局进程,其他应用通过ShareUID的方式可以和它跑在同一个进程中。

多进程的限制

虽然开启多进程方式非常简单,但是一旦开启了多进程就会出现一系列问题,大概有如下几个方面:

  1. 静态成员和单例模式完全失效

  2. 线程同步机制完全失效

  3. SharedPreference的可靠性下降

  4. Application会多次创建

这是因为在Android系统中,会为每一个进程都分配一个虚拟机,所以当A、B俩个Activity运行在不同的进程中时,虽然都可以访问同一个类的静态变量,但是访问的却是类的副本,所以会导致静态成员和单例完全失效

既然单例和成员变量都会失效,那同步机制中的锁也会不可靠,而且还会导致Application会创建多次。

总   结

本篇文章主要介绍了一些IPC的基本概念,其实对于有Android系统开发或者厂商应用开发的开发者来说,IPC可是很重要的知识。

虽然单应用使用多进程有诸多好处,但是也有很多问题,所以后续文章会深入剖析各种IPC方式的原理,让我们攻克这部分难点。

笔者水平有限,如有问题,欢迎大家评论指正。

From @字节忍者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/3028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三角函数与其他复杂函数在C语言中的实现:CORDIC算法、泰勒公式、查表法与math库详解

在C语言中实现三角函数&#xff0c;通常有四种主要方法&#xff1a;CORDIC算法、泰勒公式展开、查表法以及直接调用C语言的标准数学库。接下来我们将详细介绍这四种方法&#xff0c;并探讨其他可能的补充实现手段。 1. CORDIC算法 CORDIC&#xff08;Coordinate Rotation Dig…

MySQL数据库触发器

用途&#xff1a;订单表table01&#xff0c;运单表table02。 首先有订单表有记录/但是刚开始只有订单号/没有运单号&#xff1b; INSERT INTO testdb.table01 (id, orderid, transportid) VALUES(4, order04, ); 然后运单表有记录/记录有运单号。 INSERT INTO testdb.table…

你如何看待AIGC技术?

你如何看待AIGC技术&#xff1f; AIGC技术&#xff08;Artificial Intelligence Generated Content&#xff09;是指由人工智能生成的内容。它在许多领域都有应用&#xff0c;包括自然语言处理、图像生成、音频合成等。虽然这些技术可以提高效率和创造力&#xff0c;但也需要注…

用C#写一个读取pdf文档内容的库

安装这两个库&#xff0c;第二个库一定要安装否则有些pdf文件读取会出现异常 读取 using iText.Kernel.Pdf; using iText.Kernel.Pdf.Canvas.Parser; using iText.Kernel.Pdf.Canvas.Parser.Listener;namespace TestReadPdf {public static class PdfHelper{public static IE…

军工单位安全内网文件导出,怎样做到严密的安全管控?

军工单位是指承担国家下达的军事装备、产品研制、生产计划任务的企、事业单位&#xff0c;主要包括电子工业部、航空工业总公司、航天工业总公司、兵器工业总公司、核工业总公司、船舶工业总公司、中国工程物理研究院及各省国防工业办公室等。 军工单位的特点主要体现在以下几个…

Java的类是怎样在虚拟机中加载的?详细阐述JVM的加载、验证和解析过程

导航&#xff1a; 【Java笔记踩坑汇总】Java基础JavaWebSSMSpringBootSpringCloud瑞吉外卖/黑马旅游/谷粒商城/学成在线设计模式面试题汇总性能调优/架构设计源码 目录 一、类加载过程概述 二、加载 2.1 基础概念 2.1.1 类加载 2.1.2 类的Class对象 2.1.3 类加载子系统 …

解决 uniapp uni.getLocation 定位经纬度不准问题

【问题描述】 直接使用uni.getLocation获取经纬度不准确&#xff0c;有几百米的偏移。 【解决办法】 加偏移量 //加偏移 let x longitude let y latitude let x_pi (3.14159265358979324 * 3000.0) / 180.0 let z Math.sqrt(x * x y * y) 0.00002 * Math.sin(y * x_pi)…

信息系统项目管理师0067:数据建模(5信息系统工程—5.2数据工程—5.2.1数据建模)

点击查看专栏目录 文章目录 5.2数据工程5.2.1数据建模1.数据模型2.数据建模过程记忆要点总结5.2数据工程 数据工程是信息系统的基础工程。围绕数据的生命周期,规范数据从产生到应用的全过程,目标是为信息系统的运行提供可靠的数据保障和服务,为信息系统之间的数据共享提供安…

图像处理的基本操作

一、PyCharm中安装OpenCV模块 二、读取图像 1、基本语法 OpenCV提供了用于读取图像的imread()方法&#xff0c;其语法如下&#xff1a; image cv2.imread&#xff08;filename&#xff0c;flags&#xff09; &#xff08;1&#xff09;image&#xff1a;是imread方法的返回…

【服务器部署篇】Linux下Tomcat安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

【C++题解】1302. 是否适合晨练?

问题&#xff1a;1302. 是否适合晨练&#xff1f; 类型&#xff1a;分支 题目描述&#xff1a; 夏天到了&#xff0c;气温太高&#xff0c;小明的爷爷每天有晨练的习惯&#xff0c;但有时候温度不适合晨练&#xff1b;小明想编写一个程序&#xff0c;帮助爷爷判断温度是否适合…

MyBatis入门学习一(引入配置、体验CURD)

目录 1、MyBatis概述 1.1 MyBatis简介 1.2 MyBatis架构 1.3 MyBatis执行流程 1.4 与Hibernate的比较 2、MyBatis初体验 2.1 创建并配置项目 2.2 创建数据库表 2.3 引入MyBatis及其配置 2.3.1 MyBatis引入及配置 2.3.2 Log4j引入及配置 2.4 测试 2.4.1 编写测试类 …

C语言之回调函数+可变参数__VA_ARGS__:用法实例(四十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【linux】进程地址被占用

在强制关闭一个udp程序后&#xff0c;重启该程序报错&#xff1a; bind error: Address already in use 查找并关闭占用端口的进程&#xff1a; 首先&#xff0c;确定哪个进程占用了目标端口。在Linux系统中&#xff0c;可以使用以下命令&#xff1a; netstat -tulnp | grep …

【Linux网络】FTP服务

目录 一、FTP简介 1.FTP-文件传输协议 2.FTP的两种模式 二、安装配置FTP 1.安装环境 2.对文件的操作 3.切换目录 4.设置匿名用户 5.图形化界面登录 6.白名单与黑名单 重点与难点 一、FTP简介 1.FTP-文件传输协议 FTP是FileTransferProtocol&#xff08;文件传输协…

css中设置元素大小的属性block-size

block-size 是 CSS 中的一个属性&#xff0c;它用于设置元素的块级尺寸&#xff08;即元素的高度&#xff09;。这个属性是 height 和 max-height 的逻辑组合&#xff0c;允许你同时设置元素的最小和最大高度。 这些属性旨在让布局不再依赖于传统的物理方向&#xff08;如上下左…

如何调节电脑屏幕亮度?让你的眼睛更舒适!

电脑屏幕亮度的调节对于我们的视力保护和使用舒适度至关重要。不同的环境和使用习惯可能需要不同的亮度设置。可是如何调节电脑屏幕亮度呢&#xff1f;本文将介绍三种不同的电脑屏幕亮度调节方法&#xff0c;帮助您轻松调节电脑屏幕亮度&#xff0c;以满足您的需求。 方法1&…

hbase 集成 phoenix 实现 sql 化

1. 依赖 hbase > hbase 集群搭建 2. 下载安装包 点击下载 ps&#xff1a;该网页在内网可能打不开&#xff0c;遇到该情况有条件的可以打开 VPN 在下载 3. 上传解压 使用工具将安装包上传的服务器上 笔者这里选择 上传到 /opt/software 目录&#xff0c;解压到 /opt/mo…

spring security登录认证授权

spring security登录认证授权 是什么 Spring Security 主要实现了Authentication&#xff08;认证&#xff0c;解决who are you? &#xff09; 和 Access Control&#xff08;访问控制&#xff0c;也就是what are you allowed to do&#xff1f;&#xff0c;也称为Authorizat…

C语言扫雷游戏完整实现(下)

文章目录 前言一、排雷函数菜单二、排雷函数菜单的实现三、拓展棋盘功能四、源码1. test.c源文件2. game.h头文件3. game.c源文件 总结 前言 C语言实现扫雷游戏的排雷菜单&#xff0c;以及功能的实现&#xff0c;拓展棋盘功能&#xff0c;以及源码等。 上半部分的链接地址: C语…