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

Android中Launcher简介

一、Launcher概述与应用图标显示原理

1. Launcher的双重角色
  • 系统入口:响应点击事件,启动其他应用(通过Intent触发AMS)。

  • 桌面管理器:显示已安装应用的图标(从PackageManagerService获取应用信息)。

2. 应用图标数据加载流程

关键步骤

  1. 数据加载(子线程):

    • loadWorkspace():从数据库加载桌面布局(单元格位置、小部件等)。

    • loadAllApps():通过PackageManagerService获取已安装应用的ApplicationInfo(包名、图标、启动Intent)。

  2. 视图绑定(主线程):

    • bindAllApplications():将应用列表数据传递给AllAppsContainerView

    • setApps():更新RecyclerViewAdapter,触发图标渲染。

3. 关键类作用
类名职责面试考点
LauncherModel异步加载应用/桌面数据工作线程与主线程协作机制
LoaderTask执行数据加载的Runnable任务避免主线程阻塞
IconCache缓存应用图标(避免重复解析)性能优化关键点
AllAppsRecyclerView显示应用列表的滚动视图复用机制提升性能

二、Launcher启动流程原理

1. 系统启动阶段的Launcher加载

步骤解析

  1. 触发时机SystemServer启动完成后调用AMS.systemReady()

  2. Home Intent生成:创建包含CATEGORY_HOME的Intent(目标为Launcher)。

  3. 启动Launcher:若未运行则通过ActivityStarter启动Launcher主Activity。

2. 点击图标启动新应用

关键流程

  1. 跨进程通信:Launcher通过Binder调用AMS.startActivity

  2. 进程创建:AMS通过Socket通知Zygote fork新进程(非Binder因避免死锁)。

  3. 应用初始化

    • ActivityThread.main():初始化主线程Looper、Application。

    • AMS.attachApplication():建立Binder链接,通知启动Activity。

  4. Activity生命周期:依次调用onCreate()onStart()onResume(),触发视图绘制。


三、问题总结

请描述从点击桌面图标到应用显示的全过程
回答:

“该过程分为 Launcher响应 和 应用启动 两个阶段:
1. Launcher端

  • 点击图标触发startActivity(),生成包含FLAG_ACTIVITY_NEW_TASK的Intent。

  • 通过Binder向AMS发送请求,AMS记录ActivityRecord并检查目标进程是否存在。

2. 系统调度端

  • 进程不存在:AMS通过Socket通知Zygote fork新进程 → 加载ActivityThread.main() → 初始化Application和主线程Looper。

  • 进程存在:直接复用。

  • AMS通过ApplicationThread代理调度目标Activity的生命周期(onCreate()onResume())。

3. 应用端

  • ActivityThread处理LAUNCH_ACTIVITY消息 → 反射创建Activity实例。

  • 执行setContentView()onResume() → 触发ViewRootImpl执行Measure/Layout/Draw三阶段绘制。

  • 通过SurfaceFlinger渲染界面到屏幕,完成显示。”

http://www.lryc.cn/news/589106.html

相关文章:

  • MySQL索引与事务详解:用大白话讲透核心概念
  • compose、 pipe 组合函数实现
  • 从底层技术到产业落地:优秘企业智脑的 AI 革命路径解析
  • Basilisk库教程(二)
  • QT——QList的详细讲解
  • SpringBoot3.0 +GraalVM17 + Docker
  • AI大模型训练相关函数知识补充
  • MongoDB基础增删改查命令
  • vscode配置运行完整C代码项目
  • B/S 架构通信原理详解
  • 高标准农田气象站的功能
  • 亚矩阵云手机:破解 Yandex 广告平台多账号风控难题的利器
  • 云服务器如何管理数据库(MySQL/MongoDB)?
  • 《大数据技术原理与应用》实验报告四 MapReduce初级编程实践
  • Keepalived双机热备概述
  • 死锁问题以及读写锁和自旋锁介绍【Linux操作系统】
  • Sersync和Rsync部署
  • 免杀学习篇(1)—— 工具使用
  • Dify的默认端口怎么修改
  • 算法学习day16----Python数据结构--模拟队列
  • Nuxt3宝塔PM2管理器部署
  • linux系统------LVS+KeepAlived+Nginx高可用方案
  • LVS(Linux Virtual Server)详细笔记(理论篇)
  • 李宏毅《生成式人工智能导论》 | 第9讲 AI Agent
  • Jfinal+SQLite java工具类复制mysql表数据到 *.sqlite
  • 设计模式笔记_结构型_适配器模式
  • Redis 中的持久化机制:RDB 与 AOF
  • 基于STM32设计的智能厨房
  • redis快速入门教程
  • JavaScript进阶篇——第四章 解构赋值(完全版)