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

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

文章目录

一、 Launcher 应用简介

二、 Launcher 应用源码简介

三、 Launcher 图标点击方法分析





一、 Launcher 应用简介


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

image.png



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 33 个版本 , 分别是 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 界面展示 , 界面中的快捷方式图标就对应着不同的应用 ;


image.png



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



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


   

if (tag instanceof ShortcutInfo) {
        }



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


   

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

 

目录
打赏
0
0
0
0
39
分享
相关文章
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
521 4
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
85 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
89 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
70 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
67 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
213 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
3月前
|
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
147 11
深入探索Android系统架构与性能优化
本文旨在为读者提供一个全面的视角,以理解Android系统的架构及其关键组件。我们将探讨Android的发展历程、核心特性以及如何通过有效的策略来提升应用的性能和用户体验。本文不包含常规的技术细节,而是聚焦于系统架构层面的深入分析,以及针对开发者的实际优化建议。
141 21
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
80 5

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等