文章目录

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





一、 Launcher 应用简介



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

【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | Launcher 应用简介 | Launcher 应用源码简介 | Launcher 应用快捷方式图标点击方法分析 )_第1张图片

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 有 3 3 3 个版本 , 分别是 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 Activity        implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks,                   View.OnTouchListener {}




三、 Launcher 图标点击方法分析



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

【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | Launcher 应用简介 | Launcher 应用源码简介 | Launcher 应用快捷方式图标点击方法分析 )_第2张图片


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


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

        if (tag instanceof ShortcutInfo) {        }

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

        } else if (tag instanceof FolderInfo) {

【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | Launcher 应用简介 | Launcher 应用源码简介 | Launcher 应用快捷方式图标点击方法分析 )_第3张图片


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 shortcut            final 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);            }        }    }

更多相关文章

  1. 别人花了几万元学的Android架构技术,我帮你们免费弄来了全套视频
  2. Android 5.1 Settings模块源码分析
  3. Android方法数
  4. Android aapt实现资源分区(补充携程aapt源码)
  5. 改变Android按钮背景颜色的高效方法
  6. Android双击返回键退出程序的实现方法
  7. 基于MAC Android 8.1源码下载编译阅读
  8. 混合开发之ReactNative调用Android原生方法
  9. Android投屏电脑反向控制软件QtScrcpy使用方法

随机推荐

  1. androidRadioGroup和RadioB…
  2. Android(安卓)面试之横竖屏切换的Activit
  3. Use Android(安卓)NDK r7 to compile FFm
  4. android include 使用
  5. Android(安卓)代码生成界面Sample
  6. 【译】Android(安卓)23最新接口变化(Andro
  7. Delphi XE5 android 获取电池电量
  8. Android(安卓)中保存图片的代码
  9. Android(安卓)密度转换多分辨率
  10. Android(安卓)DHT11驱动