Android中Launcher简介及启动流程原理
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>一、Launcher概述与应用图标显示原理</li><ul class="second_class_ul"><li>1. Launcher的双重角色</li><li>2. 应用图标数据加载流程</li><li>3. 关键类作用</li></ul><li>二、Launcher启动流程原理</li><ul class="second_class_ul"><li>1. 系统启动阶段的Launcher加载</li><li>2. 点击图标启动新应用</li></ul><li>三、问题总结</li><ul class="second_class_ul"></ul></ul></div><p class="maodian"></p><h2>一、Launcher概述与应用图标显示原理</h2><p class="maodian"></p><h3>1. Launcher的双重角色</h3>
<ul><li><p><strong>系统入口</strong>:响应点击事件,启动其他应用(通过Intent触发AMS)。</p></li><li><p><strong>桌面管理器</strong>:显示已安装应用的图标(从PackageManagerService获取应用信息)。</p></li></ul>
<p class="maodian"></p><h3>2. 应用图标数据加载流程</h3>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202507/2025071609270955.png" /></p>
<p><strong>关键步骤</strong>:</p>
<ol><li><p><strong>数据加载</strong>(子线程):</p>
<ul><li><p><code>loadWorkspace()</code>:从数据库加载桌面布局(单元格位置、小部件等)。</p></li><li><p><code>loadAllApps()</code>:通过<code>PackageManagerService</code>获取已安装应用的<code>ApplicationInfo</code>(包名、图标、启动Intent)。</p></li></ul></li><li><p><strong>视图绑定</strong>(主线程):</p>
<ul><li><p><code>bindAllApplications()</code>:将应用列表数据传递给<code>AllAppsContainerView</code>。</p></li><li><p><code>setApps()</code>:更新<code>RecyclerView</code>的<code>Adapter</code>,触发图标渲染。</p></li></ul></li></ol>
<p class="maodian"></p><h3>3. 关键类作用</h3>
<table><thead><tr><th><strong>类名</strong></th><th><strong>职责</strong></th><th><strong>面试考点</strong></th></tr></thead><tbody><tr><td><code>LauncherModel</code></td><td>异步加载应用/桌面数据</td><td>工作线程与主线程协作机制</td></tr><tr><td><code>LoaderTask</code></td><td>执行数据加载的Runnable任务</td><td>避免主线程阻塞</td></tr><tr><td><code>IconCache</code></td><td>缓存应用图标(避免重复解析)</td><td>性能优化关键点</td></tr><tr><td><code>AllAppsRecyclerView</code></td><td>显示应用列表的滚动视图</td><td>复用机制提升性能</td></tr></tbody></table>
<p class="maodian"></p><h2>二、Launcher启动流程原理</h2>
<p class="maodian"></p><h3>1. 系统启动阶段的Launcher加载</h3>
<p style="text-align:center"><img alt="" height="282" src="https://img.jbzj.com/file_images/article/202507/2025071609271052.png" width="4944" /></p>
<p><strong>步骤解析</strong>:</p>
<ol><li><p><strong>触发时机</strong>:<code>SystemServer</code>启动完成后调用<code>AMS.systemReady()</code>。</p></li><li><p><strong>Home Intent生成</strong>:创建包含<code>CATEGORY_HOME</code>的Intent(目标为Launcher)。</p></li><li><p><strong>启动Launcher</strong>:若未运行则通过<code>ActivityStarter</code>启动Launcher主Activity。</p></li></ol>
<p class="maodian"></p><h3>2. 点击图标启动新应用</h3>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202507/2025071609271099.png" /></p>
<p><strong>关键流程</strong>:</p>
<ol><li><p><strong>跨进程通信</strong>:Launcher通过Binder调用<code>AMS.startActivity</code>。</p></li><li><p><strong>进程创建</strong>:AMS通过Socket通知Zygote fork新进程(<strong>非Binder因避免死锁</strong>)。</p></li><li><p><strong>应用初始化</strong>:</p>
<ul><li><p><code>ActivityThread.main()</code>:初始化主线程Looper、Application。</p></li><li><p><code>AMS.attachApplication()</code>:建立Binder链接,通知启动Activity。</p></li></ul></li><li><p><strong>Activity生命周期</strong>:依次调用<code>onCreate()</code>→<code>onStart()</code>→<code>onResume()</code>,触发视图绘制。</p></li></ol>
<p class="maodian"></p><h2>三、问题总结</h2>
<p><strong>请描述从点击桌面图标到应用显示的全过程</strong><br /><strong>回答:</strong></p>
<blockquote><p>“该过程分为 <strong>Launcher响应</strong> 和 <strong>应用启动</strong> 两个阶段:<br /><strong>1. Launcher端</strong>:</p>
<ul><li><p>点击图标触发<code>startActivity()</code>,生成包含<code>FLAG_ACTIVITY_NEW_TASK</code>的Intent。</p></li><li><p>通过Binder向AMS发送请求,AMS记录<code>ActivityRecord</code>并检查目标进程是否存在。</p></li></ul>
<p><strong>2. 系统调度端</strong>:</p>
<ul><li><p><strong>进程不存在</strong>:AMS通过Socket通知Zygote fork新进程 → 加载<code>ActivityThread.main()</code> → 初始化Application和主线程Looper。</p></li><li><p><strong>进程存在</strong>:直接复用。</p></li><li><p>AMS通过<code>ApplicationThread</code>代理调度目标Activity的生命周期(<code>onCreate()</code>→<code>onResume()</code>)。</p></li></ul>
<p><strong>3. 应用端</strong>:</p>
<ul><li><p><code>ActivityThread</code>处理<code>LAUNCH_ACTIVITY</code>消息 → 反射创建Activity实例。</p></li><li><p>执行<code>setContentView()</code>和<code>onResume()</code> → 触发<code>ViewRootImpl</code>执行<code>Measure/Layout/Draw</code>三阶段绘制。</p></li><li><p>通过<code>SurfaceFlinger</code>渲染界面到屏幕,完成显示。”</p></li></ul></blockquote>
<p>到此这篇关于Android中Launcher简介的文章就介绍到这了,更多相关Android Launcher简介内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>Android开发Launcher进程启动流程</li><li>AndroidStudio替换项目图标ic_launcher操作</li><li>android Launcher3设置默认桌面应用</li><li>Android开发实现Launcher3应用列表修改透明背景的方法</li><li>Android的Launcher启动器中添加快捷方式及小部件实例</li><li>Android实现向Launcher添加快捷方式的方法</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]