android开发 多进程的基本了解

目录

    • 如何开启多进程?
    • 理解多进程模式的运行机制

如何开启多进程?

给四大组件在androidMenifest中指定android:precess

        <activityandroid:name=".ThreeActivity"android:exported="false"android:process="com.my.process.three.remote" /><activityandroid:name=".TwoActivity"android:exported="false"android:process=":remote" /><activityandroid:name=".OneActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>

打开OneActivity、TwoActivity、ThreeActivity三个界面,查看进程id(在android studio中的device explorer),如下。
在这里插入图片描述
:remote与com.my.process.three.remote的区别。
:remote 在当前进程名前面附加当前的包名,简写的方式。com.my.process.three.remote 完整的命名方式。进程名以“:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,而进程名不以“:”开头的进程属于全局进程,其他应用通过ShareUID方式可以和它跑在同一进程中。

两个应用通过ShareUID跑在同一个进程,需要有相同的ShareUID和签名才可以。

理解多进程模式的运行机制

增加一个类BOOK,并添加静态变量id。

public class Book {public static int id = 1;
}

在OneActivity中将id置位2,打印id,然后启动TwoActivity,再打印id。
在这里插入图片描述
一般情况下,静态变量是可以在所有的地方共享的,且一处修改处处都会同步。看上图,TwoActivity应该是2才对,但显示是1,这是多进程带来的问题。
android为每个进程都分配一个独立的虚拟机,不同的虚拟机在内存上有不同的地址空间,导致在不同的虚拟机中访问同一个类的对象会产生多份副本。结合本例,com.jn.testbrodercast与:remote进程都存在一个Book类,互不干扰,在一个进程中修改id只会影响当前进程。这就是为什么在OneActivity置位2,在TwoActivity不会受到影响的原音。

多进程会造成的问题:

  1. 静态成员和单例模式完全失效
  2. 线程同步机制完全失效
  3. sharedpreferences的可靠性下降
  4. Application会创建多次
    第1个问题上面说明了,第二问题就是多个独立虚拟机,都有各自的锁,不同进程锁的不是同一个对象。第3个问题SharedPreferences不支持两个进程同时去执行写操作。第4个问题,但一个组件跑在一个新的进程中的时候,系统要创建新的进程且分配独立虚拟机,这实则是启动了一个应用。

第4点的小实验,添加将下面代码,打开三个activity,查看日志信息。

public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();Log.d("MyApplication", getProcessNameFromPid(Process.myPid()));}public String getProcessNameFromPid(int pid) {// 使用ActivityManager获取进程信息ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);if (manager != null) {List<ActivityManager.RunningAppProcessInfo> processes = manager.getRunningAppProcesses();if (processes != null) {for (ActivityManager.RunningAppProcessInfo process : processes) {if (process.pid == pid) {// 返回进程名称return process.processName;}}}}// 如果未找到,返回nullreturn null;}
}

在这里插入图片描述
MyApplication 运行了三次。

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

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

相关文章

数据恢复宝典:应对磁盘损坏无法读取的终极攻略

当电脑屏幕上突然弹出“磁盘损坏无法读取”的提示时&#xff0c;许多人的心情都会瞬间跌入谷底。那些存储在磁盘中的重要文件、珍贵的回忆&#xff0c;似乎在一瞬间都化为乌有。面对这样的困境&#xff0c;我们该如何应对&#xff1f;本文将深入探讨磁盘损坏无法读取的原因&…

chrome浏览器查看css样式

样式的查看 1.匹配器为灰色文本&#xff1a; 表示非当前选择器 2.样式有划线标识&#xff1a;CSS属性无效或未知 / 属性值无效 / 被其他属性覆盖的属性 3.属性以浅色文本显示且有感叹号提示&#xff1a;属性虽然有效&#xff0c;但由于CSS逻辑而没有任何影响 转自&#xff1a;…

车载电子电器架构 —— 售后诊断开发

车载电子电器架构 —— 售后诊断开发 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

竞赛 基于LSTM的天气预测 - 时间序列预测

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 机器学习大数据分析项目 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/po…

cd /op-bash: 无法为立即文档创建临时文件: 设备上没有空间

问题 在shell输入命令按tab键时出现以下报错 (base) [link999hadoop102 ~]$ cd /op-bash: 无法为立即文档创建临时文件: 设备上没有空间 -bash: cd: /op: 没有那个文件或目录原因分析 磁盘空间不够 df -Th # 通过命令查看具体情况解决 1、清理大文件 进入到 容量-已用 使…

Github Coplit的认证及其在JetBrains中的使用

原文地址&#xff1a;Github Coplit的认证及其在JetBrains中的使用 - Pleasure的博客 下面是正文内容&#xff1a; 前言 今天分享一个可有可无的小技巧&#xff0c;水一篇文。 如标题所述&#xff0c;Github Coplit的认证及其在JetBrains中的使用 正文 介绍JetBrains JetBrain…

数据库管理-第171期 Oracle是用这种方式确保读一致的(20240418)

数据库管理171期 2024-04-18 数据库管理-第171期 Oracle是用这种方式确保读一致的&#xff08;20240418&#xff09;1 基本概念2 用处3 注意事项总结 数据库管理-第171期 Oracle是用这种方式确保读一致的&#xff08;20240418&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#x…

Linux安装Docker完整教程及配置阿里云镜像源

官网文档地址 安装方法 1、查看服务器内核版本 Docker要求CentOS系统的内核版本高于3.10 uname -r #通过 uname -r 命令查看你当前的内核版本2、首先卸载已安装的Docker&#xff08;如果有&#xff09; 2.1 确保yum包更新到最新 yum update2.2 清除原有的docker&#xff0c…

产品原型图概念

产品原型图概念 产品原型图作用 如下图&#xff1a; 产品原型图的三种分类 线框图 通过【线段色块文字】描述产品页面。优点&#xff1a;制作快速。 缺点&#xff1a;传递信息容易遗漏。 应用&#xff1a;早期方案讨论&#xff0c;需要快速输出的场景&#xff0c;团队配合…

9.列表渲染

列表渲染 我们可以使用 v-for 指令基于一个数组来渲染一个列表。v-for 指令的值需要使用 item in items 形式的特殊语法&#xff0c;其中 items 是源数据的数组&#xff0c;而 item 是迭代项的别名 <template><div><p v-for"item in names">{{ it…

【图论 单源最短路】100276. 最短路径中的边

本文时间知识点 单源最短路 图论知识汇总 LeetCode100276. 最短路径中的边 给你一个 n 个节点的无向带权图&#xff0c;节点编号为 0 到 n - 1 。图中总共有 m 条边&#xff0c;用二维数组 edges 表示&#xff0c;其中 edges[i] [ai, bi, wi] 表示节点 ai 和 bi 之间有一条…

golang本地缓存库之bigcache

1. 前言 上周工作之余逛github看到一个本地缓存库bigcache&#xff0c;这个是allegro公司开源的一个项目&#xff0c;主要是用于本地缓存使用&#xff0c;根据他们的博客说明&#xff0c;他们编写这个库最初的目的就是实现一个非常快速的缓存服务。 看了下bigcache这个库的源…