我正在使用我的应用程序替代应用程序管理器(链接here),并希望对其进行一些优化。
事实证明,应用程序中最慢的一件事就是它的启动,其主要原因是获取应用程序名称。我打算缓存它,但如果可能的话,我也希望优化它被查询的方式。
Android有两种方法可以获取应用名称:PackageManager.getApplicationLabel和ApplicationInfo.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对象时,我才能使用其中任何一个,但这足以使用任何方法......
如果有差异,哪个在速度方面更好?
答案 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;
}