" getApplicationLabel"之间的区别是什么?和" loadLabel"?

时间:2014-04-16 15:30:40

标签: android android-package-managers

背景

我正在使用我的应用程序替代应用程序管理器(链接here),并希望对其进行一些优化。

事实证明,应用程序中最慢的一件事就是它的启动,其主要原因是获取应用程序名称。我打算缓存它,但如果可能的话,我也希望优化它被查询的方式。

问题

Android有两种方法可以获取应用名称:PackageManager.getApplicationLabelApplicationInfo.loadLabel

两者都有相同的描述,但我不确定应该使用哪一个。

不仅如此,还要查看" ApplicationInfo.loadLabel"的代码。 ,它看起来像这样:

public CharSequence loadLabel(PackageManager pm) {
    if (nonLocalizedLabel != null) {
        return nonLocalizedLabel;
    }
    if (labelRes != 0) {
        CharSequence label = pm.getText(packageName, labelRes, getApplicationInfo());
        if (label != null) {
            return label.toString().trim();
        }
    }
    if (name != null) {
        return name;
    }
    return packageName;
}

我无法找到" PackageManager.getApplicationLabel"的代码,因为它是抽象的。

问题

这两者有什么区别吗?

如果没有差异,为什么我们有2个非常相似的方法来获得相同的应用名称?我的意思是,只有当我同时拥有applicationInfo对象和PackageManager对象时,我才能使用其中任何一个,但这足以使用任何方法......

如果有差异,哪个在速度方面更好?

1 个答案:

答案 0 :(得分:1)

'PackageManager.getApplicationLabel'的源代码在'ApplicationPackageManager.java'中可用。如下;

@Override
public CharSequence getApplicationLabel(ApplicationInfo info) {
    return info.loadLabel(this);
}

ApplicationPackageManager.java

我在AppUtils.java中看到相同的包装完成如下;

/** Returns the label for a given package. */
public static CharSequence getApplicationLabel(
        PackageManager packageManager, String packageName) {
    try {
        final ApplicationInfo appInfo =
                packageManager.getApplicationInfo(
                        packageName,
                        PackageManager.MATCH_DISABLED_COMPONENTS
                                | PackageManager.MATCH_ANY_USER);
        return appInfo.loadLabel(packageManager);
    } catch (PackageManager.NameNotFoundException e) {
        Log.w(TAG, "Unable to find info for package: " + packageName);
    }
    return null;
}