Android中Launcher简介
一、Launcher概述与应用图标显示原理
1. Launcher的双重角色
系统入口:响应点击事件,启动其他应用(通过Intent触发AMS)。
桌面管理器:显示已安装应用的图标(从PackageManagerService获取应用信息)。
2. 应用图标数据加载流程
关键步骤:
数据加载(子线程):
loadWorkspace()
:从数据库加载桌面布局(单元格位置、小部件等)。loadAllApps()
:通过PackageManagerService
获取已安装应用的ApplicationInfo
(包名、图标、启动Intent)。
视图绑定(主线程):
bindAllApplications()
:将应用列表数据传递给AllAppsContainerView
。setApps()
:更新RecyclerView
的Adapter
,触发图标渲染。
3. 关键类作用
类名 | 职责 | 面试考点 |
---|---|---|
LauncherModel | 异步加载应用/桌面数据 | 工作线程与主线程协作机制 |
LoaderTask | 执行数据加载的Runnable任务 | 避免主线程阻塞 |
IconCache | 缓存应用图标(避免重复解析) | 性能优化关键点 |
AllAppsRecyclerView | 显示应用列表的滚动视图 | 复用机制提升性能 |
二、Launcher启动流程原理
1. 系统启动阶段的Launcher加载
步骤解析:
触发时机:
SystemServer
启动完成后调用AMS.systemReady()
。Home Intent生成:创建包含
CATEGORY_HOME
的Intent(目标为Launcher)。启动Launcher:若未运行则通过
ActivityStarter
启动Launcher主Activity。
2. 点击图标启动新应用
关键流程:
跨进程通信:Launcher通过Binder调用
AMS.startActivity
。进程创建:AMS通过Socket通知Zygote fork新进程(非Binder因避免死锁)。
应用初始化:
ActivityThread.main()
:初始化主线程Looper、Application。AMS.attachApplication()
:建立Binder链接,通知启动Activity。
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
渲染界面到屏幕,完成显示。”