安卓App的启动过程、安卓布局分类及布局和页面的关系

Android App 启动流程:

当你想要启动一个app时,首先得点击该app桌面图标。那点击图标时到底发生了什么呢?先看个理论知识

  • .Launcher: launcher其实就是一个app,从功能上说,是对手机上其他app的一个管理和启动,从代码上说比其他app多了一个属性,就是在AndroidManifest.xml文件中多了一个< category android:name="android.intent.category.HOME" />属性,这个属性就是在启动系统或者按Home键时会过滤这个属性,如果系统中只要一个应用具有这个属性,就会直接跳转到这个界面,也就是这个launcher,如果有多个,会弹出选择框让用户选择并且提示用户是否选择默认设置。也就是Launcher就是我们的桌面,他就是个系统的App。我们点击的每个程序图标就是他的一个item,会触发onclick事件,接受时间后然后Launcher会打开我们的应用。
  • zygote: zygote意为“受精卵“。Android是基于Linux系统的,而在Linux中,所有的进程都是由init进程直接或者是间接fork出来的,zygote进程也不例外。在Android系统里面,zygote是一个进程的名字。Android是基于Linux System的,当你的手机开机的时候,Linux的内核加载完成之后就会启动一个叫“init“的进程。在Linux System里面,所有的进程都是由init进程fork出来的,我们的zygote进程也不例外。
    我们都知道,每一个App其实都是:一个单独的dalvik虚拟机一个单独的进程 。 所以当系统里面的第一个zygote进程运行之后,在这之后再开启App,就相当于开启一个新的进程。而为了实现资源共用和更快的启动速度,Android系统开启新进程的方式,是通过fork第一个zygote进程实现的。所以说,除了第一个zygote进程,其他应用所在的进程都是zygote的子进程,这下你明白为什么这个进程叫“受精卵”了吧?因为就像是一个受精卵一样,它能快速的分裂,并且产生遗传物质一样的细胞!
  • SystemServer: SystemServer也是一个进程,而且是由zygote进程fork出来的。 知道了SystemServer的本质,我们对它就不算太陌生了,这个进程是Android Framework里面两大非常重要的进程之一——另外一个进程就是上面的zygote进程。为什么说SystemServer非常重要呢? 因为系统里面重要的服务都是在这个进程里面开启的,比如ActivityManagerService、PackageManagerService、WindowManagerService等等。
  • ActivityManagerService: ActivityManagerService,简称AMS,服务端对象,负责系统中所有Activity的生命周期。 ActivityManagerService进行初始化的时机很明确,就是在SystemServer进程开启的时候,就会初始化ActivityManagerService。
  • Instrumentation和ActivityThread: 每个Activity都持有Instrumentation对象的一个引用,但是整个进程只会存在一个Instrumentation对象。Instrumentation这个类里面的方法大多数和Application和Activity有关,这个类就是完成对Application(应用程序)和Activity初始化和生命周期的工具类。Instrumentation这个类很重要,对Activity生命周期方法的调用根本就离不开他,他可以说是一个大管家。ActivityThread,就是UI线程。App和AMS是通过Binder传递信息的,那么ActivityThread就是专门与AMS的外交工作的。

流程图:
在这里插入图片描述
总结:

  • Launcher进程: 你点击的桌面app进程 整个App启动流程的起点,负责接收用户点击屏幕事件,它其实就是一个Activity,里面实现了点击事件,长按事件,触摸等事件,可以这么理解,把Launcher想象成一个总的Activity,屏幕上各种App的Icon就是这个Activity的button,当点击Icon时,会从Launcher跳转到其他页面
  • SystemServer进程: 这个进程在整个的Android进程中是非常重要的一个,地位和Zygote等同,它是属于Application Framework层的,Android中的所有服务,例如AMS, WindowsManager, PackageManagerService等等都是由这个SystemServer fork出来的。所以它的地位可见非同一般
  • App进程: 你要启动的App所运行的进程

还要涉及六个大类:

  • ActivityManagerService:(AMS)AMS是Android中最核心的服务之一,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要,它本身也是一个Binder的实现类。
  • Instrumentation:监控应用程序和系统的交互
  • ActivityThread: 应用的入口类,通过调用main方法,开启消息循环队列。ActivityThread所在的线程被称为主线程
  • ApplicationThread: ApplicationThread提供Binder通讯接口,AMS则通过代理调用此App进程的本地方法
  • ActivityManagerProxy: AMS服务在当前进程的代理类,负责与AMS通信。
  • ApplicationThreadProxy: ApplicationThread在AMS服务中的代理类,负责与ApplicationThread通信。
  • 可以说,启动的流程就是通过这六个大类在这三个进程之间不断通信的过程

启动流程:

  • ①点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;
  • ②system_server进程接收到请求后,向zygote进程发送创建进程的请求;
  • ③Zygote进程fork出新的子进程,即App进程;
  • ④App进程,通过Binder IPC向sytem_server进程发起attach Application(附加的应用程序)请求;
  • ⑤system_server进程在收到请求后,进行一系列准备工作后,再通过binder
    IPC向App进程发送schedule LaunchActivity(安排计划发射活动)请求;
  • ⑥App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
  • ⑦主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。
  • ⑧到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。

在这里插入图片描述
补充App的启动过程:

当Launcher进程,检测到用户触摸到某个App的时候,整个软件里面最应该被加载的第一个文件是:AndroidMnifest.xml,首先它会检测机器的SDK版本(手机的android也是有SDK版本号的)能否承载这个App,这个在代码里面有设置:<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" />有的时候如果机器不满足安装就装不上,有的是安装能装上但是不能运行。再来就是去获取app所需要的的一些权限,比如说网络请求:<uses-permission android:name="android.permission.INTERNET"/>,还有就是一个App有那么多界面,具体要启动哪一个要看<intent-filter>这个标签在哪一个<activity>标签里面,下图代表第一个要加载的界面是:MainActivity
在这里插入图片描述

  • (SDK(Software Development Kit 软件开发工具),Android SDK 顾名思义,就是专门用于开发Android 应用的工具包.只有通过Android SDK 我们才可以开发运行在Android 系统中的应用,比如说创建页面/服务等.)
  • app和linux的程序类似,需要相应的依赖库,1个android系统默认都会集成你需要的依赖,如果没有,就需要你的apk里里添加相应库,andoroid本质就是一个复杂的linux系统,这么理解会更好理解。
    在这里插入图片描述

如果这时候创建另外一个界面:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述创建完成后,可以看到R.java里面(存放控件、界面等等的ID)多了activity_other的ID,并且res下面多了activity_other.xml这个布局文件。然后将这个布局界面设置为启动的第一个界面:
在这里插入图片描述
然后再介绍.java`文件里面的代码:

activity是一个界面,我们创建的MainActivity是继承自activity,所以MainActivity还是一个界面,这个界面有一些生成周期, onCreate是代表这个界面被创建,通过AndroidMainfest.xml确认了这个界面会不会被加载,如果这个界面被加载然后这个onCreate入口会自动的被操作系统拿来执行,其实就像之前写的main函数,是一个入口,之后的一些列开发,会在这个函数里面进行。super.onCreate(savedInstanceState)会调用父类的onCreate去创建一个空白的界面,去做一些页面初始化(由系统去做)。
setContentView(R.layout.activity_main)表示将这个java文件和activity_main这个布局文件关联起来。是通过ID的方式让java文件和xml文件进行关联。
在这里插入图片描述

  • R.java里面存放了activity_main界面的ID:

在这里插入图片描述
Android六大基本布局:

Android六大基本布局分别是:线性布局LinearLayout、表格布局TableLayout、相对布局RelativeLayout、层布局FrameLayout、绝对布局AbsoluteLayout、网格布局GridLayout。其中,表格布局是线性布局的子类。网格布局是Android4.0新增的,在手机程序设计中,绝对布局基本上不用,用得相对较多的是线性布局和相对布局。

学习基本布局要理解两个比较基础概念的图:

  • Android布局管理器的类图:
    在这里插入图片描述上面这个类图只是说了六大基本布局的关系,其实ViewGroup还有其他一些布局管理器。这里要理解一点就是布局也是布局管理器,因为布局里面还可以添加布局。

  • Android布局的XML关系图:
    在这里插入图片描述
    第二个图说的是:布局管理器里面既可以添加多个布局管理器又可以添加多个控件,而控件里面不能再添加布局或控件了。
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

界面显示一张图片:

在这里插入图片描述

参考博文: 安卓App的启动过程

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

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

相关文章

Linux文件默认权限和umask笔记

关于Linux文件默认权限的问题&#xff0c;可以实际先尝试一下如下命令&#xff1a;root用户登录[rootlocalhost test]# touch file1[rootlocalhost test]# ls-l file1-rw-r--r-- 1 root root 0 May 5 08:28 file1 #输出结果 对应的数字权限 644[rootlocalhost test]# touch fi…

Android相对布局(RelativeLayout)常用属性、练习使用按键、文本框等控件、线性布局(LinearLayout)属性

RelativeLayout中子控件常用属性&#xff1a; 子控件默认是从父控件的左上角开始排列的 相对于父控件 android:layout_alignParentTop"true" 和父控件的顶部对齐android:layout_alignParentBottom"true" 和父控件的底部对齐android:layout_alignPar…

Seata AT模式

基本思路 先决条件 支持本地ACID事务的关系数据库。通过JDBC访问数据库的Java应用程序。 整体机制 从两个阶段提交协议的演变&#xff1a; 阶段1&#xff1a;在同一本地事务中提交业务数据和回滚日志&#xff0c;然后释放本地锁和连接资源。阶段2&#xff1a; 对于提交情况…

自媒体各大平台收益对比_哪些自媒体平台没有新手期,适合小白撸收益?

2-26把我设置为星标&#xff0c;不错过每一次的干货&#xff5e;各大自媒体平台的新手期总是让小白们望而却步&#xff0c;特别是百家号审核非常严格&#xff0c;如果没思路、没人指导&#xff0c;过新手有难度。不过&#xff0c;还是有很多平台对新手宝宝很友好&#xff0c;没…

Linux关于文件的权限笔记

1、调整文件的权限命令&#xff1a;chmodLinux的每个文件都定义了文件的拥有者&#xff1a;u(user)、拥有组&#xff1a;g&#xff08;group&#xff09;、其他人&#xff1a;o&#xff08;others&#xff09;权限&#xff0c;对应的权限用rwx的组合来定义。使用chmod命令&…

启动rrt什么意思_python学习第144课--创建虚拟机、设置虚拟机参数以及启动虚拟机...

【每天几分钟&#xff0c;从零入门python编程的世界&#xff01;】上节我们介绍了下载虚拟机以及centOS的相关事项&#xff0c;现在我们创建虚拟机。●创建虚拟机安装好virtualbox之后&#xff0c;我们点击Oracle VM VirtualBox打开管理器&#xff0c;界面如下图&#xff1a;你…

Android按键响应的几种方式、安卓页面的跳转、页面跳转传参、页面自动跳转、Activity(页面)的生命周期

按键响应的第一种方式&#xff1a; 在XML文件里面设置按键的onClick绑定函数。就像下面的代码&#xff0c;给Button设置onClick属性&#xff0c;在按键被按下的时候&#xff0c;会调用java文件里面的onClickbtton1这个函数&#xff0c;因为现已将它和这个按钮进行了绑定。利用…

pycharm体验

查看python版本 退出 exit()

Linux文本检索命令grep笔记

grep是在linux系统中基于行文本非常实用检索工具&#xff0c;通过该命令可以将匹配到的结果信息输出到终端控制台。语法格式&#xff1a;grep [-ivnc] 需要匹配的内容 文件名常用参数说明&#xff1a;-i 检索的时候不区分大小写-c 检索到的匹配行数-n 检索到的匹配行显式具体的…

成立出版社的条件_创始人亲述:法国鸿飞文化出版社的诞生故事和做书心得

鸿飞文化出版社2007年在法国创立&#xff0c;专门出版由中国作家和法国插画师共同创作的图画书。创始人叶俊良引用苏东坡的诗句“人生到处知何似&#xff0c;应似飞鸿踏雪泥。泥上偶然留指爪&#xff0c;鸿飞那复计东西。”为出版社取名&#xff0c;希望通过这些“印迹”为读者…

python单行注释和多行注释

# 后面加一个空格&#xff0c;下面就不会有波浪线了 点击小灯泡下的第一行&#xff0c;可以调整注释格式 多行注释

Linux文件查询笔记

1、数据库查找命令&#xff1a;locateLinux也可以通过locate命令查找文件&#xff0c;locate命令主要是依据一个数据库文件来执行文件的查找&#xff0c;默认情况下Linux每天会默认检索系统中的所有文件&#xff0c;然后把检索的文件信息记录到数据库文件中。因为运行locate命令…

柱坐标系下的ns方程_麦克斯韦方程组小结

一、▽ 算子、点积、叉积l▽ 算子叫“del”算子&#xff0c;即<< span"">∂/∂x,∂/∂y,∂/∂z>,可以理解为一个符号向量&#xff0c;向量里的元素是偏微分运算符号&#xff0c;没有任何具体意义&#xff0c;只是一个表示方法。ln维向量的内积定义如下&a…

Linux进程终止命令kill或killall​笔记

在linux命令下&#xff0c;如果需要终止某个进程&#xff0c;可以使用kill或者killall等命令来实现。终止命令的原理都是向linux内核发送一个系统操作的信号以及某个进程的ID&#xff0c;然后系统内核会根据指定的进程ID进行相应的处理。kill命令典型的用法&#xff1a;首先使用…

Visual Studio的调试技巧

Visual Studio的调试技巧 【原文地址】 Debugging Tips with Visual Studio 2010 【原文发表日期】 2010/8/19 10:48 AM 这是我写的关于VS2010和.Net4发布的博客系列的第26篇。 今天的博文包含了一些有用的能用于VS的调试技巧。 我的朋友 Scott Cate&#xff08;他写了很多很…

Linux排序命令sort笔记

很多时候Linux需要对文本相对比较规范的文本数据进行排序&#xff0c;这时候可以使用Linux系统下的sort命令进行处理。语法格式&#xff1a;sort [-ntkr] filename常用参数&#xff1a;-n 根据数字进行排序-t 指定的分隔符-k 指定分隔符的第几列-r 降序排序用法示例&#xff1a…

redirect路由配置 vue_Web前端:Vue路由进阶配置

大家好&#xff0c;我来了&#xff0c;本期为大家带来的前端开发知识是”Web前端&#xff1a;Vue路由进阶配置“&#xff0c;有兴趣做前端的朋友&#xff0c;和我一起来看看吧&#xff01;1. 页面打开权限流程页面是否能打开有以下两点判断&#xff1a;1. 判断是否增加登陆的判…

python格式化输出

格式化输出字符串 格式化输出整数 格式化输出浮点数 输出&