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 到移动,什么前端难题都见过。热衷于用技术打磨产品,带领团队把复杂的事情做到极简,体验做到极致。喜欢探索新技术,也爱分享一些实战经验,帮助大家少走弯路!

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

相关推荐
木头左24 分钟前
【架构设计】教育类 App 服务端化改造:AI 上移、题库分层与个人题库归属
android·架构设计·系统设计·后端开发·数据库设计
墨狂之逸才1 小时前
USB 的 HOST 和 DEVICE 到底有什么区别?ADB 调试应该选哪个?
android
奶油话梅糖2 小时前
苹果的内核跑上了安卓手机:2,631 Star 的 HakiOS 让 XNU 在 Adreno GPU 上画出 118 帧
android·macos·智能手机
恋猫de小郭2 小时前
Flutter THLC 的 WebView 滚动终于从 70 FPS 提升到 120 FPS
android·前端·flutter
好的佩奇13 小时前
Dart 之扩展类型
android·flutter·dart
alexhilton15 小时前
2027 Android 开发者路线图:学习、面试与 AI
android·kotlin·android jetpack
灿飞屋17 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
疯华整猫18 小时前
我用 Trae 把 Android 内存账重算了一遍
android·性能优化·源码
TimeFine20 小时前
AI 编程工作流的设计:从人工判断到 AI裁判
android·ai编程
阿杰m20 小时前
Android源码第四章:Android 系统启动——App 的第一行代码从哪来?
android