文章目录

  • 一、 Launcher 应用简介
  • 二、 Launcher 应用源码简介
  • 三、 Launcher 图标点击方法分析

一、 Launcher 应用简介


Launcher 应用 : Android 中每个应用都是一个可执行程序 , Android 的主界面也是一个应用 , 称为 Launcher 应用 , 现在分析主界面的相关逻辑 , 进而找到应用启动的入口位置 ;

2 . 查找 Launcher 应用 : 查找 使用 adb shell dumpsys activity activities 命令 , 可以查看当前的 Activity 名称 ;

$ adb shell dumpsys activity activities

3 . 查看 Launcher 应用 Activity 界面 : 由输出的信息可知 , 当前运行的 Activity 叫做 NexusLauncherActivity , 该 Activity 所在的应用就是 Launcher 应用 , 用户点击该应用中的图标 , 即可跳转到系统中安装的不同应用中 ;

    Running activities (most recent first):TaskRecord{64eb48e #297 I=com.google.android.apps.nexuslauncher/.NexusLauncherActivity U=0 StackId=0 sz=1}Run #0: ActivityRecord{849baf3 u0 com.google.android.apps.nexuslauncher/.NexusLauncherActivity t297}mResumedActivity: ActivityRecord{849baf3 u0 com.google.android.apps.nexuslauncher/.NexusLauncherActivity t297}mLastPausedActivity: ActivityRecord{849baf3 u0 com.google.android.apps.nexuslauncher/.NexusLauncherActivity t297}ResumedActivity:ActivityRecord{849baf3 u0 com.google.android.apps.nexuslauncher/.NexusLauncherActivity t297}ResumedActivity: ActivityRecord{849baf3 u0 com.google.android.apps.nexuslauncher/.NexusLauncherActivity t297}

二、 Launcher 应用源码简介


1 . Launcher 应用源码位置及版本 :

① Launcher 版本 : Launcher 有 333 个版本 , 分别是 Launcher , Launcher2 , Launcher3 ;

② 源码位置 : 其位置再 Android 源码路径下的 \packages\apps 目录下 ;

  • Launcher 版本的路径 : \packages\apps\Launcher
  • Launcher2 版本的路径 : \packages\apps\Launcher2
  • Launcher3 版本的路径 : \packages\apps\Launcher3

③ Launcher 版本与安卓版本对应关系 : 2.1 之前使用 Launcher , 2.2 ~ 4.3 使用 Launcher2 , 4.4 以后使用 Launcher3 应用 ;

2 . Launcher2 源码分析 :

① Launcher2 应用 Activity 界面源码位置 : \packages\apps\Launcher2\src\com\android\launcher2\Launcher.java

② Launcher.java 界面 : 这里分析 Launcher2 的 Launcher.java 类 , 该类就是 Android 开机后 , 看到的界面 , 在该界面中维护了所有应用的图标 , 点击图标可以进入这些 Android 应用 ;

public final class Launcher extends Activityimplements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks,View.OnTouchListener {}

三、 Launcher 图标点击方法分析


1 . Launcher 应用快捷方式图标 : 这是在主界面中点击图标 , 启动安卓应用的核心方法 , 下面分析该方法的源码 ; 下图是 Launcher 界面展示 , 界面中的快捷方式图标就对应着不同的应用 ;

2 . 点击图标调用方法 : 点击任意一个图标 , 都会调用如下 onClick 方法 , 传入点击的图标组件作为参数 ;

3 . 判定点击的组件是否是快捷方式图标 : 检查该快捷方式组件中的 tag 标签是否属于 ShortcutInfo 快捷方式信息 , 用于甄别用户点击的是否是快捷方式图标 ; 这是 Launcher 应用启动安卓应用的核心分支 ;

        if (tag instanceof ShortcutInfo) {}

4 . 判断是否是多个图标文件夹 : 如果是多个应用图标的组合 , 即多个图标在一个格子中 , 走这个分支 ; 如下图中右侧的图标文件夹 , 444 个图标放在一个目录中 ;

        } else if (tag instanceof FolderInfo) {

5 . 启动应用的核心代码 : 在 if (tag instanceof ShortcutInfo) 分支中 , 如果点击应用图标 , 会调用 startActivitySafely 方法 , 启动应用 ;

boolean success = startActivitySafely(v, intent, tag);

6 . 完整的快捷方式图标点击方法示例 :

    /*** 根据点击的快捷方式图标启动对应的应用** @param v 快捷方式图标对应的组件*/public void onClick(View v) {// Make sure that rogue clicks don't get through while allapps is launching, or after the// view has detached (it's possible for this to happen if the view is removed mid touch).if (v.getWindowToken() == null) {return;}if (!mWorkspace.isFinishedSwitchingState()) {return;}Object tag = v.getTag();// 检查该快捷方式组件中的 tag 标签是否属于 ShortcutInfo 快捷方式信息// 用于甄别用户点击的是否是快捷方式图标 if (tag instanceof ShortcutInfo) {// Open shortcutfinal Intent intent = ((ShortcutInfo) tag).intent;int[] pos = new int[2];v.getLocationOnScreen(pos);intent.setSourceBounds(new Rect(pos[0], pos[1],pos[0] + v.getWidth(), pos[1] + v.getHeight()));// 启动快捷方式图标对应的安卓应用boolean success = startActivitySafely(v, intent, tag);if (success && v instanceof BubbleTextView) {mWaitingForResume = (BubbleTextView) v;mWaitingForResume.setStayPressed(true);}} else if (tag instanceof FolderInfo) {// 如果是多个应用图标的组合 , 即多个图标在一个格子中 , 走这个分支if (v instanceof FolderIcon) {FolderIcon fi = (FolderIcon) v;handleFolderClick(fi);}} else if (v == mAllAppsButton) {if (isAllAppsVisible()) {showWorkspace(true);} else {onClickAllAppsButton(v);}}}

【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | Launcher 应用简介 | Launcher 应用源码简介 | Launcher 应用快捷方式图标点击方法分析 )相关推荐

  1. 抖音SEO优化源码,企业号搜索排名系统,技术理论分析搭建。

    前言:抖音SEO优化源码,企业号搜索排名系统,技术理论分析搭建. 抖音seo源码如何搭建?抖音seo排名优化系统软件部分源码分析,代码打包中... 场景:在 python 中,你可以使用 list[1 ...

  2. 【优化求解】基于matlab禁忌搜索算法求解函数极值问题【含Matlab源码 1204期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [优化求解]基于matlab禁忌搜索算法求解函数极值问题[含Matlab源码 1204期] 点击上面蓝色字体,直接付费下载,即可. 获取 ...

  3. 【Matlab风电功率预测】麻雀算法优化LSSVM风电功率预测(多输入单输出)【含源码 1718期】

    一.代码运行视频(哔哩哔哩) [Matlab风电功率预测]麻雀算法优化LSSVM风电功率预测(多输入单输出)[含源码 1718期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 ...

  4. 【优化算法】基于matlab反向策略的麻雀搜索算法【含Matlab源码 1918期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[优化算法]基于matlab反向策略的麻雀搜索算法[含Matlab源码 1918期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式 ...

  5. 【Android 逆向】类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )

    文章目录 一.ClassLoader 源码简介 二.BaseDexClassLoader 源码简介 三.DexClassLoader 源码简介 四.PathClassLoader 源码简介 五.InM ...

  6. 【附源码】计算机毕业设计Python安卓电影购票app设计与实现wx4x1(源码+程序+LW+调试部署)

    [附源码]计算机毕业设计Python安卓电影购票app设计与实现wx4x1(源码+程序+LW+调试部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境配置: Pytho ...

  7. 《Spark商业案例与性能调优实战100课》第25课:Spark Hash Shuffle源码解读与剖析

    <Spark商业案例与性能调优实战100课>第25课:Spark Hash Shuffle源码解读与剖析

  8. Android 性能监测工具,优化内存、卡顿、耗电、APK的方法

    导语     安卓大军浩浩荡荡,发展已近十个年头,技术优化月新日异,如今 Android 9.0 代号P  都发布了,Android系统性能已经非常流畅了.但是,到了各大厂商手里,改源码自定系统,使得 ...

  9. Android性能调优 - 稳定性优化

    1.你们做了哪些稳定性方面的优化? 随着项目的逐渐成熟,用户基数逐渐增多,DAU持续升高,我们遇到了很多稳定性方面的问题,对于我们技术同学遇到了很多的挑战,用户经常使用我们的App卡顿或者是功能不可用 ...

最新文章

  1. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——遍历和查找
  2. python数据库建表_mysql数据表如何创建
  3. linux部署tomcat启动后无法访问,linux中启动tomcat后浏览器无法访问的解决方法
  4. rz、sz 命令 安装(Xshell 安装)
  5. TCGA(三)--采用GDC API进行数据查询和获取
  6. git rebase 两个交叉branch换基
  7. mysql sql语句面试经典50题_经典sql面试及答案(50)
  8. Mac 效率工具必备神器 —— Alfred
  9. java菜鸟突破面试系列-终章
  10. 设计模式-模板方法模式-以简历模板为例
  11. linux怎么查看hwaddr_怎么查询linux centos mac地址
  12. IE地址栏的最大长度
  13. word 2010 尾注 尾注序号 连续尾注 尾注分隔符 删除
  14. 计算机前沿软件应用课程怎么样,信息技术前沿心得体会|信息技术应用心得体会...
  15. 按阶段划分软件测试:单元测试 , 集成测试 , 系统测试 , 验收测试
  16. 打开 Office 出现配置进度然后报错“Microsoft Office 无法找到此应用程序的许可证,修复尝试失败或者已被取消”
  17. 机器学习-查准率、查全率、调和平均值
  18. STM32通过I2C接口采集温湿度
  19. C#对UG二次开发环境配置、调试和开发教程
  20. 下载免费的中文字体及生成jsPDF需要的js文件

热门文章

  1. 命名式ACL配置实例
  2. SpingMVC类型转换
  3. css实现tab切换效果
  4. deepin linux下python安装mysqldb
  5. (转)CSS样式表继承详解
  6. Android SlidingMenu以及ActionBarSherlock的基础使用教程
  7. python 栈和队列 排序 初级数据结构
  8. 双绞线网线的连接方式
  9. jQuery笔记之工具方法extend插件扩展
  10. 将用户名保存至cookie中