Android开发实战班-Android App 的启动过程

news2024/11/20 10:51:04

Android 应用的启动过程是应用程序从用户点击图标到用户界面呈现给用户的关键步骤。理解应用的启动流程对于开发高效、响应迅速的 Android 应用至关重要。本章节将深入讲解 Android 应用从启动到显示用户界面的整个过程,包括系统启动流程、应用启动流程、Activity 启动流程以及相关的组件和概念。

5.1 Android 系统启动流程概述

在深入探讨应用启动流程之前,了解 Android 系统启动的基本流程有助于理解应用启动的背景:

  1. Bootloader 加载内核

    • 当设备启动时,Bootloader 加载 Android 操作系统的内核。
  2. 启动 Init 进程

    • 内核加载完成后,Init 进程(PID=1)启动,这是 Android 系统的第一个进程,负责启动其他系统服务。
  3. 启动 Zygote 进程

    • Zygote 进程是 Android 系统中的核心进程,负责预加载常用的 Java 类和资源,并为每个应用进程提供孵化服务。
  4. 启动 System Server

    • System Server 是 Android 系统中的核心服务进程,负责启动和管理系统服务,例如 Window Manager, Activity Manager, Package Manager 等。
  5. 启动 Launcher 应用

    • System Server 启动完成后,Launcher 应用(桌面应用)启动,用户可以开始使用设备。

5.2 应用启动流程

当用户点击应用图标时,Android 系统会启动应用进程,并创建应用的第一个 Activity。以下是应用启动的主要步骤:

  1. Launcher 发送启动 Intent

    • 用户点击应用图标时,Launcher 应用会发送一个启动应用的 Intent 给 Android 系统。
  2. ActivityManagerService 处理启动请求

    • Android 系统的 ActivityManagerService (AMS) 接收到启动请求后,会检查目标应用的进程是否已经启动。
  3. 启动应用进程

    • 如果应用进程尚未启动,AMS 会请求 Zygote 进程孵化一个新的应用进程。
    • 新进程启动后,会加载应用的 classes.dex 文件,并初始化应用的 Application 类。
  4. 创建 Application 对象

    • 应用进程启动后,会创建 Application 类的实例(如果定义了自定义的 Application 类)。
    • Application 对象在应用的整个生命周期内存在,可以用于初始化全局状态。
  5. 创建 Activity 对象

    • AMS 会通知应用进程创建目标 Activity 对象。
    • 应用进程会反射创建 Activity 对象,并调用其生命周期方法。
  6. 调用 Activity 生命周期方法

    • onCreate() -> onStart() -> onResume()
    • Activity 被创建并显示给用户。

5.3 Activity 启动流程

Activity 的启动是应用启动过程中最重要的部分。以下是 Activity 启动的主要步骤:

  1. 发送启动 Activity 的 Intent

    • 应用进程接收到 AMS 的启动请求后,会发送一个启动 Activity 的 Intent。
  2. 创建 Activity 对象

    • 应用进程通过反射机制创建 Activity 对象。
  3. 调用 Activity 生命周期方法

    • onCreate():
      • Activity 被创建时调用,进行初始化操作,例如设置布局、绑定数据等。
    • onStart():
      • Activity 对用户可见时调用。
    • onResume():
      • Activity 与用户交互时调用,Activity 处于前台,可以接收用户输入。
  4. WindowManager 添加窗口

    • Activity 创建完成后,WindowManager 会为 Activity 添加一个窗口,并将其显示在屏幕上。
  5. Activity 处于运行状态

    • Activity 处于前台,可以与用户进行交互。

5.4 关键组件与概念

  • Application 类:

    • 应用启动时创建的全局类,可以用于初始化全局状态,例如全局变量、数据库连接等。
    • 可以通过自定义 Application 类来扩展应用的功能。
  • ActivityManagerService (AMS):

    • Android 系统中的核心服务,负责管理 Activity 的生命周期、任务和回退栈等。
  • WindowManager:

    • 负责管理应用的窗口,例如 Activity 的窗口。
    • WindowManager 会为每个 Activity 创建一个窗口,并将窗口显示在屏幕上。
  • Zygote 进程:

    • Android 系统中的核心进程,负责预加载常用的 Java 类和资源,并为每个应用进程提供孵化服务。
  • Intent:

    • 用于在组件之间传递消息,例如启动 Activity、启动 Service 等。
    • Intent 可以是显式的(指定组件名称)或隐式的(指定动作和数据)。

5.5 课后作业

  1. 任务一:自定义 Application 类

    • 创建一个自定义的 Application 类,例如 MyApplication
    • MyApplication 中初始化全局状态,例如数据库连接、第三方库等。
    • AndroidManifest.xml 中注册自定义的 Application 类。
  2. 任务二:启动 Activity 的不同方式

    • 创建一个新的 Activity,例如 SecondActivity
    • 使用显式 Intent 启动 SecondActivity
    • 使用隐式 Intent 启动 SecondActivity,例如通过 ACTION_VIEW 动作。
  3. 任务三:观察应用启动流程

    • 在自定义的 Application 类和 Activity 的生命周期方法中添加日志输出。
    • 运行应用,观察日志输出,理解应用启动流程。

通过本章节的学习,学员将能够理解 Android 应用从启动到显示用户界面的整个过程,掌握 Application 类、ActivityManagerService、WindowManager 等关键组件的作用,并能够通过自定义 Application 类和不同方式启动 Activity 来扩展应用的功能。

作者简介

前腾讯电子签的前端负责人,现 whentimes tech CTO,专注于前端技术的大咖一枚!一路走来,从小屏到大屏,从 Web 到移动,什么前端难题都见过。热衷于用技术打磨产品,带领团队把复杂的事情做到极简,体验做到极致。喜欢探索新技术,也爱分享一些实战经验,帮助大家少走弯路!

温馨提示:可搜老码小张公号联系导师

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

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

相关文章

代码随想录算法训练营第三十五天| 01背包问题 二维 、01背包问题 一维、416. 分割等和子集 。c++转java

背包理论基础 视频地址: 带你学透0-1背包问题!| 关于背包问题,你不清楚的地方,这里都讲了!| 动态规划经典问题 | 数据结构与算法_哔哩哔哩_bilibili 01背包问题 二维 题目我是在Acwing上面做的,思路可以…

亚马逊云科技宣布新推出Elasticahe for Redis的 Valkey缓存

Amazon ElastiCache 宣布支持 Valkey,与其他支持的引擎相比,无服务器的价格低 33%,基于节点的价格低 20%。使用 ElastiCache Serverless for Valkey,客户可以在一分钟内创建缓存,并且起步价低至每月 6 USD。Valkey 是由…

SpringBoot3.x.x整合Ehcache3 实例(入门踩坑教程)

近期尝试了一下 SpringBoot 3.3.5 JDK17 Ehcache3.10.8整合 注意,这个版本的boot,提出了公用的缓存模板,Spring官网有相关介绍,整合ehcache需要使用jcache。 老版本的3.0版本以下整合,我这里就不参与了,可以…

跨平台WPF框架Avalonia教程 十六

SelectableTextBlock 可选文本块 SelectableTextBlock 块是一个用于显示文本的标签,允许选择和复制文本。它可以显示多行,并且可以完全控制所使用的字体。 有用的属性​ 您可能最常使用这些属性: 属性描述SelectionStart当前选择的起始字…

每日一练:【优先算法】双指针之移动零(easy)

双指针概念介绍 常见的双指针有两种形式,一种是对撞指针,一种是左右指针。 对撞指针:一般用于顺序结构中,也称左右指针。 • 对撞指针从两端向中间移动。一个指针从最左端开始,另一个从最右端开始,然后逐渐…

ASP.NET Core Webapi 返回数据的三种方式

ASP.NET Core为Web API控制器方法返回类型提供了如下几个选择&#xff1a; Specific type IActionResult ActionResult<T> 1. 返回指定类型&#xff08;Specific type&#xff09; 最简单的API会返回原生的或者复杂的数据类型&#xff08;比如&#xff0c;string 或者…

【JAVA】使用mybatis plus查询数据库中的geometry字段为null

目录 问题描述&#xff1a; 原码&#xff1a; 实体类&#xff1a; 接口&#xff1a; 解决方法&#xff1a; 1、创建Handle 2、配置handle让mybatis-plus能够识别 相关代码&#xff1a; 问题描述&#xff1a; 在 MyBatis Plus 中&#xff0c;查询的 geometry 字段在数据库…

51c自动驾驶~合集28

我自己的原文哦~ https://blog.51cto.com/whaosoft/12030824 #自动驾驶建图的统一矢量先验地图编码 高德地图&西交 | 先验驾驶 论文链接&#xff1a;https://arxiv.org/pdf/2409.05352 写在前面&笔者的个人理解 最近出现了很多先验地图的论文&#xff0c;高德地图…

【全面解读】Apache SeaTunnel常见问题全攻略

使用SeaTunnel需要安装Spark或者Flink这样的引擎么&#xff1f; 不需要&#xff0c;SeaTunnel 支持 Zeta、Spark 和 Flink 作为同步引擎的选择&#xff0c;您可以选择之一就行&#xff0c;社区尤其推荐使用 Zeta 这种专为同步场景打造的新一代超高性能同步引擎。Zeta 被社区用…

Spring Boot3.x自动配置不生效的排查与解决:IDEA 文件夹命名导致的问题

在使用Spring Boot搭建多模块项目时&#xff0c;需要使用到自动配置功能&#xff0c;把一些通用功能封装成模块后通过 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件注册配置类。然而&#xff0c;最近遇到一个奇怪的问题&#xff1a…

JavaSE(十四)——文件操作和IO

文章目录 文件操作和IO文件相关概念Java操作文件文件系统操作文件内容操作字节流FileOutputStreamFileInputStream代码演示 字符流FileWriterFileReader代码演示 缓冲流转换流 案例练习 文件操作和IO 文件相关概念 文件 通常指的是包含用户数据的文件&#xff0c;如文本文件、…

Qt桌面应用开发 第五天(常用控件)

目录 1.QPushButton和ToolButton 1.1QPushButton 1.2ToolButton 2.RadioButton和CheckBox 2.1RadioButton单选按钮 2.2CheckBox多选按钮 3.ListWidget 4.TreeWidget控件 5.TableWidget控件 6.Containers控件 6.1QScrollArea 6.2QToolBox 6.3QTabWidget 6.4QStacke…

Vue.js 插槽 Slots 实际应用 最近重构项目的时候遇到的...

前端开发中 插槽 Slots 是一个重要的概念 我们可以查看一下vue.js的官方文档 https://cn.vuejs.org/guide/components/slots 类似于连接通道一样 可以把核心代码逻辑搬到另外的地方 做一个引用 而原先的地方可能并不能这样书写 对于这个概念我在vue的官方文档里面找到了…

ubuntu pytorch容器内安装gpu版本的ffmpeg

一、基础镜像和生成容器 pytorch/pytorch &#xff1a;1.13.1-cuda11.6-cudnn8-devel 生成容器&#xff0c;一定要加NVIDIA_DRIVER_CAPABILITIEScompute,utility,video,graphics&#xff0c;否则侯建无法推流&#xff0c;报错缺少编码之类的。 docker run -it --gpus all -e …

VSCode+ESP-IDF开发ESP32-S3-DevKitC-1(2)第一个工程 LED心跳灯

VSCodeESP-IDF开发ESP32-S3-DevKitC-1&#xff08;2&#xff09;第一个工程 LED心跳灯 前言1.新建工程2.编写控制LED代码3.LED控制独立成.c和.h文件 前言 实际开发中很多时候我们需要有一个类似心跳灯或运行指示灯的灯以不同的状态闪烁以表示程序的运行状态&#xff0c;所以第…

在ubunto18.04安装node 14.16.0

这里演示安装node 14.16.0&#xff0c;其他版本也一样的安装步骤&#xff0c;需要注意1 1.检查本机服务器类型&#xff0c;有的是x64&#xff0c;有的是ARM&#xff0c;先查清楚是什么类型再进行下载&#xff0c;否则会存在编译出错的问题 bash: /opt/node-v14.16.0-linux-x6…

基于YOLOv8深度学习的智慧农业猪行为检测系统研究与实现(PyQt5界面+数据集+训练代码)

随着智慧农业的快速发展&#xff0c;畜牧业的智能化管理已逐渐成为提高生产效率、提升动物福利、降低运营成本的关键手段之一。在此背景下&#xff0c;畜牧场对动物行为的自动化监测需求日益增长&#xff0c;尤其是在大型养猪场&#xff0c;猪群的日常行为检测对于疾病预防、饲…

独立资源池与共享资源池在云计算中各自的优势

在云计算领域&#xff0c;独立资源池和共享资源池是两种关键的资源管理策略&#xff0c;它们各自具有独特的优势&#xff0c;以适应不同的业务需求和场景。 独立资源池的优势 资源独占性&#xff1a;独立资源池为特定应用或用户提供专属的资源&#xff0c;这意味着资源不会被其…

异或和之和

//暴力做法 枚举每个子区间 O(n^3) //优化1 利用前缀异或和快速求出区间异或和 O(n^2) //优化2 处理位运算的常用方法&#xff1a;拆位法 常用的思想&#xff1a;贡献法思想 下面详见优化2&#xff1a; 1.拆位贡献法 2.实战真题1 题目链接&#xff1a;1.异或和之和 - 蓝桥…

【金融风控项目-07】:业务规则挖掘案例

文章目录 1.规则挖掘简介2 规则挖掘案例2.1 案例背景2.2 规则挖掘流程2.3 特征衍生2.4 训练决策树模型2.5 利用结果划分分组 1.规则挖掘简介 两种常见的风险规避手段&#xff1a; AI模型规则 如何使用规则进行风控 **使用一系列逻辑判断(以往从职人员的经验)**对客户群体进行区…