本文主要分析launcher3 如何加载默认的icon ,基于AOSP Q Launcher3 code

1、 launcher首先会初始化设备配置属性,比如加载哪些图标,图标布局n * n等等,这些配置定义在device_profiles.xml 中,device_profiles.xml 会关联到default_workspace_n*n.xml,
2、 在LoaderTask.java 的loadworkspace函数中会去load默认的布局,其实就是去加载 1中初始化后的配置

1、InvariantDeviceProfile初始化

Launcher在oncreate的时候会通过单例初始化LauncherAppState类

LauncherAppState app = LauncherAppState.getInstance(this);

在LauncherAppState的构造中会初始化InvariantDeviceProfile,先看一下InvariantDeviceProfile构造函数,

  public InvariantDeviceProfile(Context context) {......// This guarantees that width < heightminWidthDps = Utilities.dpiFromPx(Math.min(smallestSize.x, smallestSize.y), dm);minHeightDps = Utilities.dpiFromPx(Math.min(largestSize.x, largestSize.y), dm);ArrayList<InvariantDeviceProfile> closestProfiles = findClosestDeviceProfiles(minWidthDps, minHeightDps, getPredefinedDeviceProfiles(context));InvariantDeviceProfile interpolatedDeviceProfileOut =invDistWeightedInterpolate(minWidthDps,  minHeightDps, closestProfiles);InvariantDeviceProfile closestProfile = closestProfiles.get(0);numRows = closestProfile.numRows;numColumns = closestProfile.numColumns;numHotseatIcons = closestProfile.numHotseatIcons;//这个布局就是后面load default favorites加载所需要的布局iddefaultLayoutId = closestProfile.defaultLayoutId;Log.d("InvariantDeviceProfile", "InvariantDeviceProfile: defaultLayoutId: " + defaultLayoutId);demoModeLayoutId = closestProfile.demoModeLayoutId;numFolderRows = closestProfile.numFolderRows;numFolderColumns = closestProfile.numFolderColumns;......

通过getPredefinedDeviceProfiles 去load device_profiles.xml中定义的所有profile,放到List中,然后通过findClosestDeviceProfiles从 list中找出最接近的profile。

    /*** Returns the closest device profiles ordered by closeness to the specified width and height*/// Package private visibility for testing.ArrayList<InvariantDeviceProfile> findClosestDeviceProfiles(final float width, final float height, ArrayList<InvariantDeviceProfile> points) {// Sort the profiles by their closeness to the dimensionsArrayList<InvariantDeviceProfile> pointsByNearness = points;Collections.sort(pointsByNearness, new Comparator<InvariantDeviceProfile>() {public int compare(InvariantDeviceProfile a, InvariantDeviceProfile b) {return Float.compare(dist(width, height, a.minWidthDps, a.minHeightDps),dist(width, height, b.minWidthDps, b.minHeightDps));}});return pointsByNearness;}

2、LoadWorkspace 加载默认的favorites

loadworkspace()是加载添加在workspace上的 shortcut、folder、widget,这里我们只看如何加载默认的图标。

        Log.d(TAG, "loadWorkspace: loading default favorites");LauncherSettings.Settings.call(contentResolver,LauncherSettings.Settings.METHOD_LOAD_DEFAULT_FAVORITES);

通过ContentResolver的call方法调用到LauncherProvider去实现,看一下launcherprovider call实现,

@Overridepublic Bundle call(String method, final String arg, final Bundle extras) {createDbIfNotExists();switch (method) {......case LauncherSettings.Settings.METHOD_LOAD_DEFAULT_FAVORITES: {loadDefaultFavoritesIfNecessary();return null;}......

loadDefaultFavoritesIfNecessary()这个流程就是找到之前已经初始化好的device profile,通过InvariantDeviceProfile中的defaultLayoutId找到对应的default_workspace_n*n.xml,然后解析加载是数据并插入到数据库中,可以看一下测试打印的调用栈

10-28 16:40:46.334 D/LauncherProvider(32452): com.android.launcher3.LauncherProvider$DatabaseHelper.insertAndCheck(LauncherProvider.java:1020)
10-28 16:40:46.334 D/LauncherProvider(32452): com.android.launcher3.AutoInstallsLayout.addShortcut(AutoInstallsLayout.java:304)
10-28 16:40:46.334 D/LauncherProvider(32452): com.android.launcher3.DefaultLayoutParser$AppShortcutWithUriParser.invalidPackageOrClass(DefaultLayoutParser.java:136)
10-28 16:40:46.334 D/LauncherProvider(32452): com.android.launcher3.AutoInstallsLayout$AppShortcutParser.parseAndAdd(AutoInstallsLayout.java:374)
10-28 16:40:46.334 D/LauncherProvider(32452): com.android.launcher3.DefaultLayoutParser$AppShortcutWithUriParser.parseAndAdd(DefaultLayoutParser.java:91)
10-28 16:40:46.334 D/LauncherProvider(32452):  com.android.launcher3.DefaultLayoutParser$ResolveParser.parseAndAdd(DefaultLayoutParser.java:220)
10-28 16:40:46.334 D/LauncherProvider(32452): com.android.launcher3.AutoInstallsLayout.parseAndAddNode(AutoInstallsLayout.java:284)
10-28 16:40:46.334 D/LauncherProvider(32452): com.android.launcher3.AutoInstallsLayout.parseLayout(AutoInstallsLayout.java:225)
10-28 16:40:46.334 D/LauncherProvider(32452): com.android.launcher3.AutoInstallsLayout.loadLayout(AutoInstallsLayout.java:201)
10-28 16:40:46.335 D/LauncherProvider(32452):  com.android.launcher3.LauncherProvider$DatabaseHelper.loadFavorites(LauncherProvider.java:1060)
10-28 16:40:46.335 D/LauncherProvider(32452): com.android.launcher3.LauncherProvider.loadDefaultFavoritesIfNecessary(LauncherProvider.java:492)
10-28 16:40:46.335 D/LauncherProvider(32452): com.android.launcher3.LauncherProvider.call(LauncherProvider.java:392)
10-28 16:40:46.335 D/LauncherProvider(32452):  android.content.ContentProvider$Transport.call(ContentProvider.java:401)
10-28 16:40:46.335 D/LauncherProvider(32452): android.content.ContentResolver.call(ContentResolver.java:1756)
10-28 16:40:46.335 D/LauncherProvider(32452): com.android.launcher3.LauncherSettings$Settings.call(LauncherSettings.java:312)
10-28 16:40:46.335 D/LauncherProvider(32452):  com.android.launcher3.model.LoaderTask.loadWorkspace(LoaderTask.java:263)
10-28 16:40:46.335 D/LauncherProvider(32452): com.android.launcher3.model.LoaderTask.run(LoaderTask.java:168)

另外,loadDefaultFavoritesIfNecessary() 通过判断if (sp.getBoolean(EMPTY_DATABASE_CREATED, false)) 是否要加载默认的workspace,一般情况下,只会加载一次,除非删除launcher.db数据库,EMPTY_DATABASE_CREATED这个key在db创建的时候会设为true,一旦加载default workspace完成,则会remove EMPTY_DATABASE_CREATED key。

Launcher3 workspace 加载默认的布局相关推荐

  1. Launcher3 桌面加载流程分析

    Launcher3 桌面加载流程分析 主入口Launcher 首先来看Launcher.java的onCreate方法,里面代码很多,只看主流程部分: @Override protected void ...

  2. 用tableView实现的一种加载数据的布局

    用tableView实现的一种加载数据的布局 此博文是应朋友之邀解决他的业务逻辑问题 效果: 素材: 源码: ImageCell.h 与 ImageCell.m // // ImageCell.h / ...

  3. vue进入页面执行的钩子函数_解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题...

    项目需求:图片加载时,当鼠标滚动至当前图片进行加载并加上上滑特效,实现这个效果需要对文档文档滚动位置和图片的当前位置进行比较.但是mounted 钩子函数执行时img图片并未加载出来也就是占位为空,导 ...

  4. 图片加载失败后---加载默认图片

    一 . 图片加载失败原因: 文件路径不正确: 标签属性等元素错误: 错误的文件扩展名 文件丢失 存放位置出现问题 网络传输问题: 二 . 加载失败后页面默认样式 如下 ↓: 三 . 封装函数:图片加载 ...

  5. 【05】Android时时监测手机的旋转角度 根据旋转角度确定在什么角度加载竖屏布局 在什么时候加载横屏布局

    一.场景描述: 近期开发中遇到个问题,就是我们在做横竖屏切换的功能时,横竖屏布局是操作系统去感知的,作为开发员没法确定Activity在什么时候加载横屏布局,在什么时候加载竖屏布局.因此为了找到加载横 ...

  6. vue + 图片加载 + 默认图片

    需求: 图片数据未返回 + 图片数据返回为空 + 图片加载出错 时,图片采用默认图片展示. 解决: 先判断返回数据是否有,再通过img 的 load事件判断是否加载完成. 现象: 图片会先加载默认图片 ...

  7. easyui combogrid分页加载默认值时无法自动跳转到相应页的解决方案

    2019独角兽企业重金招聘Python工程师标准>>> 当如果easyui combogrid分布加载时,有默认值,且默认值不在第一页时,此时combogrid里的显示值为idFie ...

  8. Android布局加载慢,Android布局优化(四)X2C — 提升布局加载速度200%

    系列文章 前言 在Android布局优化(一)从布局加载原理说起中我们说到了布局加载的两大性能瓶颈,通过IO操作将XML加载到内存中并进行解析和通过反射创建View.这里介绍一种避免运行时通过IO操作 ...

  9. 设置afni环境变量—打开afni加载默认的大脑模板

    打开afni的默认安装目录-/abin,里面有个对afni环境变量描述的文件README.environment.根据该文件对环境变量的功能描述,可以设置各种环境变量使得afni的操作简洁. 举个例子 ...

最新文章

  1. Udacity机器人软件工程师课程笔记(二十) - 感知 - 校准,过滤, 分段, RANSAC
  2. 2018-2019-1 20165318《信息安全系统设计基础》第八周课上测试
  3. 普通平键的主要尺寸有_?办公桌分类及尺寸介绍
  4. HTML IFRAME 用法小总结
  5. 程序员成长的三个方法
  6. 微软Office Online服务安装部署及wopi代码实现--------Office Online服务器的安装
  7. 1093芯片做正弦波逆变器_长途自驾游“缺电”如何选购正确车载逆变器,避开商家套路...
  8. Android Service 的一些笔记
  9. 【运动快乐】享受赤脚慢跑 收获健康快乐
  10. tornado学习笔记day08-tornado中的异步
  11. [转]Spring中property-placeholder的使用与解析
  12. Kali Linux 秘籍 第一章 安装和启动Kali
  13. 第二章 ASP.NET MVC (控制器向视图传递值(一))
  14. wordpress 添加友情链接
  15. Java Collection Framework View
  16. Mac、centos安装MongoDB
  17. 探索储电式太阳能充电器,太阳能充电到底有没有必要有储电功能
  18. java海康摄像头添加人脸_网络摄像头(海康)抓拍 人脸检测
  19. Dreamweaver CS6的基本使用教程
  20. android gradle教程,Android Gradle入门

热门文章

  1. 菜鸟学Struts——I18N对国际化的支持
  2. FFmpeg多媒体格式分类详解
  3. 小红书品牌春节营销前瞻,热门笔记暗藏3大营销策略
  4. 计算机专业小学期实验心得,小实验作文心得最新5篇
  5. 首宏集团董事长徐海波获颁“科技创新先锋人物”称号
  6. unlegal android,yy99/cordova-baidu-location
  7. windows系统bat批处理 笔记本开wifi 笔记本查看wifi密码
  8. 【谷粒商城】分布式事务与下单
  9. python实现网络游戏NPC任务脚本引擎(带限时任务功能)
  10. 09_方法重写丶多态丶抽象类