必威体育Betway必威体育官网
当前位置:首页 > IT技术

Android O Launcher3-Workspace加载

时间:2019-08-18 17:13:15来源:IT技术作者:seo实验室小编阅读:65次「手机版」
 

android o

一.简述:

Launcher这里我们研究主要是Launcher3(Android O平台),各个手机公司自家的ROM Launcher,咱们也看不到,但是八九不离十啦,他们也应该是重写关键函数来实现他们的需要。

二.流程详述:

这里写图片描述

1.核心方法:

LauncherProvider#loadDefaultFavoritesIfNecessary()

这里写图片描述

A.第一种:从某个设定好的APK(特定packageName)里面取得xml

这里关键实现方法为:createWorkspaceLoaderFromAPPrestriction()。在这会去从UserManager获取对应的Bundle对象,当Bundle对象中包含“workspace.configuration.package.name”的时候,回去获取对应的apk的resouces。

接着继续调用get()函数:1.首先获取是否含有如,default_layout_6x6_h5.xml(有grid size和hotseat count拼接);2.然后获取是否有如,default_layout_6x6.xml(有grid size拼接);3.最后获取默认的default_layout.xml

这里写图片描述

B.第二种:从配置APK(与android.autoinstalls.config.action.PLAY_AUTO_INSTALL)读xml

这里调用AutoInstallsLayout中的get函数,最关键的实现函数是findSystemApk。根据特定的action:android.autoinstalls.config.action.PLAY_AUTO_INSTALL,来获取是否system中有这发出的这个action的app,若有则去获取apk的packagename和resource。

接着继续调用get()函数:1.首先获取是否含有如,default_layout_6x6_h5.xml(有grid size和hotseat count拼接);2.然后获取是否有如,default_layout_6x6.xml(有grid size拼接);3.最后获取默认的default_layout.xml

大致流程图如下:

这里写图片描述

C.第三种:从一个preload特定名称(com.android.launcher3.action.PARTNER_CUSTOMIZATION)的APK里面取得xml

最关键的实现函数是findSystemApk。根据特定的action:android.autoinstalls.config.action.PLAY_AUTO_INSTALL,来获取是否system中有这发出的这个action的app,若有则去获取apk的packagename和resource。

接着通过hasDefaultLayout()来判断apk中是否有partner_default_layout.xml,若有,则将此xml作为defaultlayout

这里写图片描述

这种情况可以参看Google GMS中的一个GmsSampleIntegration 应用。

a.看他的Androidmanifest.xml

   <receiver android:name=".LauncherCustomizationreceiver">
        <intent-filter>
            <action android:name="com.android.launcher3.action.PARTNER_CUSTOMIZATION" />
        </intent-filter>
    </receiver>

b.资源目录中有partner_default_layout.xml,其中有对布局的定义。

D.第四种:从原生Launcher中读取xml文件(这里根据桌面dimen去选取4*4 5*5 的xml文件)

这里主要是从InvariantDeviceprofile类中获取到对应defaultLayoutId,然后通过DefaultLayoutparser类调到用其父类AutoInstallsLayout的构造函数中进行对xml文件的解析。

获取默认的defaultLayouId主要是在InvariantDeviceProfile中获取的:在其构造函数中调用到getPredefinedDeviceProfiles(),会从device_profiles.xml中选择合适的,选择的方法是获取屏幕的width和height来匹配xml文件中的minWidthDps和minHeightDps,挑选开平方后值最相近的一个profiles。最终取到对应的defaultLayouId(对应default_workspace_3x3 、default_workspace_4x4等)

这里写图片描述

InvariantDeviceProfile的各个参数依次代表:

配置名字(任意定义)、最小宽度(单位是dp)、最小高度(单位是dp)、桌面行数、桌面列数、文件夹行数、文件夹列数、主菜单中predicted apps最小列数、桌面Icon的size(单位是dp)、桌面Icon的文字size(单位是dp)、Hotseat的Icon个数、Hotseat的Icon的size(单位是dp)、默认的桌面配置LayoutId、demo apk的layuoutId。

大致的流程图如下:

这里写图片描述

ps:xml文件中元素的x 、y的值最终在layout中的位置:若为正,则即为x/y;若为负,则为行/列数-y/x

首次加载的时候会走上面四种中的某一种,最终这些会被加载到db文件中,之后重启等操作加载的就是直接从db中获取出来的。

三.总结

1.如果有需求需要客制化的workspace,可以考虑在第四步中加入客制化的workspace.xml的加载实现即可;

2.Launcher 几x几的实现即在profiles中获取的numRows和numColumns值来获取;

3.后续会专开一篇大致讲下xml的写法。

FAQ(后续补充):

相关阅读

Android N 新特性

2016年5月19日,谷歌在美国加州的山景城举办了 Google I/O 开发者大会中发布。2016年6月,Android N正式命名为“牛轧糖” 本届I/O开

Android Freeline加速编译App方案 使用和总结

Freeline简介 在Android Studio还没推出Instant Run功能之前,每次修改Android 工程项目时都要将整个项目重新编译一次,然后再将资

Android 8.0 SurfaceFlinger

一、SurfaceFlinger编译模块组成 码路径:frameworks/native/services/surfaceflingerSurfaceFlinger二进制分成surfaceflinger(main

微信4.3 Android版开始内测 推出聊天记录迁移功能

在不同设备中使用同一微信账号一直有个大问题——聊天记录无法同步。而下一版本的微信终于要加入聊天记录迁移功能。目前微信4.3

android Studio里查看db文件

一个插件即可解决android studio查看db文件的问题 插件名就是database 首先去setting找到plugings搜索database点击蓝色的文字

分享到:

栏目导航

推荐阅读

热门阅读