【源码剖析】Launcher 8.0 源码 (18) --- Launcher 启动流程 第六步之LoadWorkspace 第2小步(2)根据不同的图标类型放入不同的缓存中

本文详细分析了Android Launcher8.0启动流程中LoadWorkspace的第二步,涉及将数据库读取内容按图标类型放入缓存的过程。源码解析包括根据不同图标类型如SHORTCUT、APPLICATION、DEEP_SHORTCUT解析Intent,检查组件的有效性,处理应用的安装状态,以及如何处理未安装或禁用的应用。最后,内容解释了如何将数据加载到缓存sBgDataModel中,以便在桌面上显示。
摘要由CSDN通过智能技术生成

Launcher8.0启动流程的第六步中loadworkspace的第2小步的做好准备后,已经锁定对于的数据库,并且开启循环读取模式,接着就是依次将读取的内容放入缓存中。

 

直接上源码,由于源码太长,无法分隔成多个小步来简化记忆。

分析以注释的形式放在源码中间。

            boolean allowMissingTarget = false;
            switch (c.itemType) {
            case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
            case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
            case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT:

//对数据库每一条的读取方式,按照类型区分,最常见的是图标类型,SHORTCUT、APPLICATION、DEEP_SHORTCUT都是图标类型。图标类型,在桌面上占据1x1的格子,且点击打开对应应用的属于图标大类。
                intent = c.parseIntent();
                if (intent == null) {
                    c.markDeleted("Invalid or null intent");
                    continue;
                }

以上代码有从c获取intent,其源码如下:

public Intent parseIntent() {
    String intentDescription = getString(intentIndex);
    try {
        return TextUtils.isEmpty(intentDescription) ?
                null : Intent.parseUri(intentDescription, 0);
    } catch (URISyntaxException e) {
        Log.e(TAG, "Error parsing Intent");
        return null;
    }
}

intentIndex是之前构造器里面的数据库的对应参数。

intentIndex = getColumnIndexOrThrow(LauncherSettings.Favorites.INTENT);

在intent参数来源有三处。一个是xml文件中,在首次开机的时候。一个是packagemanager,手机里面按照的应用的intent都是知道的。最后是快捷方式生成的intent。 Intent是用来启动应用的参数。

 

回到loadworksapce源码:
                int disabledState = quietMode.get(c.serialNumber) ?
                        ShortcutInfo.FLAG_DISABLED_QUIET_USER : 0;
                ComponentName cn = intent.getComponent();
                targetPkg = cn == null ? intent.getPackage() : cn.getPackageName();

//对c.user进行判断,shortcut只在默认用户显示。
                if (!Process.myUserHandle().equals(c.user)) {
                    if (c.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) {
                        c.markDeleted("Legacy shortcuts are only allowed for default user");
                        continue;
                    } else if (c.restoreFlag != 0) {
                        // Don't restore items for other profiles.
                        c.markDeleted("Restore from managed profile not supported");
                        continue;
                    }
                }

//检查是否有对应的package name,如果没有传入包名则不是应用
                if (TextUtils.isEmpty(targetPkg) &&
                        c.itemType != LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) {
                    c.markDeleted("Only legacy shortcuts can have null package");
                    continue;
                }

                boolean validTarget = TextUtils.isEmpty(targetPkg) ||
                        launcherApps.isPackageEnabledForProfile(targetPkg, c.user);
 //检查对应的应用是否在系统中为disable状态,如果为disable状态,则不显示。通过isActivityEnabledForProfile来判断。 当用户在设置里面对某个应用设置为disable,回到Launcher的时候,Launcher的数据库里面还是保留着该应用。这里会进行一个判断,当数据库有,但手机不支持的时候,不显示。
                if (cn != null && validTarget) {
                    if (launcherApps.isActivityEnabledForProfile(cn, c.user)) {
                            c.markRestored();
                    } else {

//有一种特例,应用还没有安装到手机,也就是手机不支持,但是该应用处于下载状态。而且是在autointall的布局中,首先定义了其位置。这种时候,则可以显示。
                        if (c.hasRestoreFlag(ShortcutInfo.FLAG_AUTOINTALL_ICON)) {
                            intent = pmHelper.getAppLaunchIntent(targetPkg, c.user);
                            if (intent != null) {
                                c.restoreFlag = 0;
                                c.updater().put(
                                        LauncherSetting

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值