Framework入门02-应用进程

2-1 你知道应用进程是怎么启动的吗?

(1) Linux下进程启动的方式

pid=fork(),这个方法会返回2次。pid为0时在子进程执行,pid为子进程的进程id时,在父进程执行。若在子进程中,没有execve(path, argv, env)函数,则子进程共享父进程的资源;如执行了此函数,则path会替换父进程的资源,即不与父进程共享。

(2) 应用进程启动的基本流程

什么时候触发的进程启动?

答:被动启动,启动组件的时候,判断进程是否启动,若未启动,则先启动进程。

谁发起的?

答:由AMS向zygote发起的,通过socket通信,将要启动的类名ActivityThread和方法名main发送给zygote.

进程是谁启动的?怎么启动的?

答:zygote fork出应用进程,会去执行入口函数,即ActivityThread的main函数。应用进程启动之后向AMS报告,将applicationThread注册到AMS,整个启动才算结束。

2-2 应用是怎么启用Binder机制的?

了解binder是用来干什么的? 答:跨进程通信

应用里面哪些地方用到了binder机制?答:启动组件(如:activity,service,广播)

应用的大致启动流程是怎样的? 答:AMS请求zygote,zygote启动应用,应用告诉AMS它已经启动了。

一个进程是怎么启用binder机制的?

答:binder机制是在zygote启动应用的过程中启动。zygote的runOnce()函数中 =》获取参数 =》for应用 =》在子进程执行handleChildProc() =》zygoteInit() =》后续步骤同2-3(3)启用binder机制:打开binder驱动;映射内存,分配缓冲区;启动binder线程,进入binder loop。

2-3 谈谈你对Application的理解

(1) Application的作用(初级)

答:1.保存应用进程内的全局变量(生命周期长);2.初始化操作(启动早);3.提供应用上下文。

(2) Application的类继承关系以及生命周期(中级)

答:继承关系:Application继承自ContextWrapper,ContextWrapper继承Context,ContextWrapper类包装了Context,在其中有个成员变量Context mBase,mBase通过构造函数或者attachBaseContext()方法赋值初始化(典型的静态代理)。

生命周期:启动和结束。启动包括:构造函数;attachBaseContext;onCreate。

(3) Application的初始化原理(高级)

ActivityThread的main() =》 ActivityThread thread = new ActivityThread();thread.attach(false);

=》ActivityManagerNative.getDefault().attachApplication(mAppThread)这里是跨进程binder调用

=》在AMS中attachApplication() => attachApplicationLocked(thread, callingPid);

=》thread.bindApplication(...) 跨进程binder调用 => 在应用进程中,bindApplication()

=》封装参数到 AppBindData data,sendMessage(H.BIND_APPLICATION, data),即发送消息到主线程

=》handleBindApplication(AppBindData data)

=》先获取应用安装包信息(LoadedApk类),然后makeApplication(...)

=》构建ContextImpl context,newApplication(...)

=》newApplication(cl.loadClass(className), context);

=》Application app = (Application)clazz.newInstance();app.attach(context);

=》callApplicationOnCreate(app),即application的onCreate()方法。

(4) 不要在application的onCreate()方法中执行耗时操作,为什么?

在attachApplicationLocked(IApplicationThread thread,...)方法中,这里是在主线程执行的。

boolean attachApplicationLocked(IApplicationThread thread,...) {

thread.bindApplication(...);//oneway,即向AMS发送请求后,不用等处理完马上返回,这里并不会阻塞主线程

...

mStackSupervisor.attachApplicationLocked(...);//Activity组件的启动

mServices.attachApplicationLocked(app, processName);//Service组件的启动

sendPendingBroadcastsLocked(app);//广播的启动

}

从上面可以看出,onCreate()方法中执行耗时操作,不会阻塞AMS,但会延迟应用组件的启动。

2-4 谈谈你对Context的理解

Context的作用:应用组件的上下文,有了上下文,组件就可以访问资源和调用系统服务。

(1) 应用里面有多少个Context?不同的Context之间有什么区别?

答:activity的个数 + service的个数 + application的个数(单进程只有1个实例)。广播和Content Provider并没有继承context。activity因为要显示UI,是继承了ContextThemeWraper,而application和service是继承了ContextWraper.

(2) Activity里的this和getBaseContext有什么区别?

答: this是指Activity对象自己,getBaseContext是指Context里的成员变量Context mBase.

(3) getApplication和getApplicationContext有什么区别?

答:都是返回application对象。getApplicationContext是Context里的一个抽象方法,getApplication只有activity和service里特有的。

(4) 应用组件的构造,onCreate、attachBaseContext调用顺序?

答:应用组件的构造方法 -> attachBaseContext -> onCreate.

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

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

相关文章

阿里云容器服务助力极氪荣获 FinOps 先锋实践者

作者:海迩 可信云评估是中国信息通信研究院下属的云计算服务和软件的专业评估体系,自 2013 年起历经十年发展,可信云服务评估体系已日臻成熟,成为政府支撑、行业规范、用户选型的重要参考。 2022 年 5 月国务院国资委制定印发《…

linux中校验文件的sha256sum值

用途 下载源文件和校验文件进行校验,防止被中间人篡改文件内容。 同理的还有yum仓库,加载第三方库时,要先导入一个key密钥。 sha256校验 这里用helm软件包示例 curl -LO https://get.helm.sh/helm-v3.12.0-linux-amd64.tar.gzcurl -LO ht…

【云原生】K8S二进制搭建一

目录 一、环境部署1.1操作系统初始化 二、部署etcd集群2.1 准备签发证书环境在 master01 节点上操作在 node01与02 节点上操作 三、部署docker引擎四、部署 Master 组件4.1在 master01 节点上操 五、部署Worker Node组件 一、环境部署 集群IP组件k8s集群master01192.168.243.1…

EventBus 开源库学习(二)

整体流程阅读 EventBus在使用的时候基本分为以下几步: 1、注册订阅者 EventBus.getDefault().register(this);2、订阅者解注册,否者会导致内存泄漏 EventBus.getDefault().unregister(this);3、在订阅者中编写注解为Subscribe的事件处理函数 Subscri…

ceil(),floor(),round()函数C++详解

ceil&#xff08;&#xff09; ceil()函数是这样的&#xff1a; double ceil(double x) ceil函数可以把x上取整。 例子&#xff1a; #include <bits/stdc.h> using namespace std; int main() {double a, b;cin >> a >> b;printf("ceil(%.2f) %.2…

TensorFlow搭建神经网络

TensorFlow版本&#xff1a;2.13.0TensorFlow官方文档TensorFlow官方文档中文版 TensorFlow中搭建并训练一个神经网络分为以下几步&#xff1a; 定义神经网络配置损失函数以及优化器训练&#xff1a;反向传播、梯度下降 下面以LeNet-5为例&#xff0c;搭建一个卷积神经网络用…

消息队列项目(2)

我们使用 SQLite 来进行对 Exchange, Queue, Binding 的硬盘保存 对 Message 就保存在硬盘的文本中 SQLite 封装 这里是在 application.yaml 中来引进对 SQLite 的封装 spring:datasource:url: jdbc:sqlite:./data/meta.dbusername:password:driver-class-name: org.sqlite.…

自定义elementui的主题

通常情况下&#xff0c;我们使用elementui框架的时候默认组件的主题都是白色的&#xff0c;比如&#xff1a; 但是如果想自定义主题&#xff0c;改变主题颜色&#xff0c;以及各种默认颜色&#xff0c;其实也不难&#xff1a; 配置默认主题&#xff0c;选好后点击下载 在vu…

【云计算 | Docker】Docker容器后台运行不了?entrypoint在作妖?

1. 问题 使用镜像alpine起个容器&#xff0c;使其保持后台运行&#xff0c;正常情况有如下的效果&#xff0c;可以发现容器保持运行状态。 [rootk8s-master helloWorld]# docker run -dit docker.io/alpine /bin/sh 8d39d7579d5e4f1a560aef16ba57ab5cae2506ea9105e21cbc0634…

python + seaborn绘制条形图

文章目录 条形图countplotpointplot条形图 条形图是我们熟悉的一种绘图方式,它可以实现这一目标。在 seaborn 中,barplot() 函数对一个完整的数据集进行操作,并应用一个函数来获取估计值(默认情况下取平均值)。当每个类别中有多个观测值时,它还会使用引导法计算估计值的…

墨觉Run Plus耳机真的很好嘛?南卡、韶音、墨觉哪个好

随着近年来蓝牙耳机市场的快速变化&#xff0c;耳机的样式也在不断演变&#xff0c;从入耳式发展到无需入耳的骨传导耳机。骨传导耳机因其可以通过骨传导技术进行声音传输&#xff0c;无需贴合耳道即可实现耳机功能&#xff0c;因此备受市场欢迎。尤其是近两年&#xff0c;骨传…

关于简单C++函数在内存中的存储问题

举例 int main(){... }int data(){... }int add(){... } 在分段式存储管理时&#xff0c;根据人们的需求&#xff0c;人为分段存储 如图&#xff1a;

ios_base::out和ios::out、ios_base::in和ios::in、ios_base::app和ios::app等之间有什么区别吗?

2023年8月2日&#xff0c;周三晚上 今天我看到了这样的两行代码&#xff1a; std::ofstream file("example.txt", std::ios_base::out);std::ofstream file("example.txt", std::ios::out);这让我产生了几个疑问&#xff1a; 为什么有时候用ios_base::o…

Matlab实现支持向量机算法(附上多个完整仿真源码)

支持向量机是一种常见的机器学习算法&#xff0c;它可以用于分类和回归问题。在Matlab中使用支持向量机&#xff0c;可以方便地构建和训练模型&#xff0c;并进行预测和评估。本文将介绍Matlab支持向量机的基本原理以及一个简单的分类案例。 文章目录 1. 支持向量机的基本原理2…

JAVA实现动态代理的两种方式及主要的区别

两种动态代理 JAVA中实现动态代理主要目的是为了实现AOP&#xff0c;即面向切面编程。 而动态代理主要是在程序运行期间&#xff0c;基于原类生成代理类&#xff0c;并且将需要织入的代码加入到代理类的方法中&#xff0c;可以实现动态的代码链接。 JAVA实现动态代理的两种方式…

如何通过 WordPress 数据库启用插件?【进不去后台可用】

如果您无法访问 WordPress 后台并需要激活插件以恢复访问权限&#xff0c;则可以通过 WordPress 数据库来实现。本文将向您展示如何使用数据库轻松激活 WordPress 插件。 何时使用数据库激活 WordPress 插件&#xff1f; 许多常见的 WordPress 错误会阻止网站所有者访问 WordP…

k8s目录

k8s笔记目录&#xff0c;更新中... 一 概念篇 1.1概念介绍 1.2 pod 1.3 controller 1.3.1 deployment 1.3.2 statefulset 1.3.3 daemonset 1.3.4 job和cronJob1 1.4 serivce和ingress 1.5 配置与存储 1.5.1 configMap 1.5.2 secret 1.5.3 持久化存储 1.5.4 pv、…

selenium 和 chromedriver 使用的一些总结

1 selenium 下载地址 selenium PyPIhttps://pypi.org/project/selenium/ 2 chromedriver 下载地址 &#xff0c;可以下载最新版的 chromedriver ChromeDriver - WebDriver for Chrome - Downloadshttps://chromedriver.chromium.org/downloadsChrome for Testing availabi…

管理类联考——写作——论说文——实战篇——行文篇——通用性强,解释多种现象的经典理论——谈必要

前言 本节内容涉及“社会分工理论”“资源稀缺性”“瓶颈理论”等理论。这些理论一般用在“利大于弊式结构”中“整体有必要”的部分&#xff0c;也可用于“AB二元类”题目“谈好处”的部分。 需要注意的是&#xff0c;“有好处”一般指有它更好&#xff1b;“有必要”一般指没…

Kafka介绍

目录 1&#xff0c;kafka简单介绍 2&#xff0c;kafka使用场景 3&#xff0c;kafka基本概念 kafka集群 数据冗余 分区的写入 读取分区数据 顺序消费 顺序消费典型的应用场景&#xff1a; 批量消费 提交策略 kafka如何保证高并发 零拷贝技术&#xff08;netty&#…