当前位置: 首页 > article >正文

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

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.kler.cn/a/406648.html

相关文章:

  • 工具学习_Docker
  • Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
  • Spark使用过程中的 15 个常见问题、详细解决方案
  • IDEA算法的详细介绍及Python实现
  • Linux驱动开发快速入门——字符设备驱动(直接操作寄存器设备树版)
  • 嵌入式中利用QT实现服务器与客户端方法
  • 分布式系统稳定性建设-性能优化篇
  • 【大数据学习 | Spark-Core】yarn-client与yarn-cluster的区别
  • Oracle 19c Rac + ADG搭建(源库:RAC,目标库FS)
  • 迈向AI驱动的数据新时代:探索SQL Server 2025的全新向量数据库
  • 一文说清:C和C++混合编程
  • VTK知识学习(12)- 读取PNG图像
  • 深入探索JMeter bin目录中的Properties文件:优化性能测试的关键
  • 【功能实现】bilibili顶部鼠标跟随效果怎么实现?
  • Python +Pyqt5 简单视频爬取学习及工具实现(二)
  • 5.STM32之通信接口《精讲》之USART通信---实验串口接收程序
  • 关于汽车多核架构
  • 算法专题十一: 基础递归
  • Tomcat 任意写入文件漏洞(CVE-2017-12615)
  • docker镜像源配置、换源、dockerhub国内镜像最新可用加速源(仓库)
  • 10 分钟,教你如何用 LLama-Factory 训练和微调 LLama3 模型
  • 计算机网络(14)ip地址超详解
  • Vision-Language Models for Vision Tasks: A Survey 论文解读
  • 【代码随想录day36】【C++复健】1049. 最后一块石头的重量 II ; 494. 目标和 ;474.一和零
  • MIT 6.S081 | 操作系统 | Lab1: Xv6 and Unix utilities
  • SSRF漏洞利用