在我的主屏幕替代应用程序中,我需要获取所有已安装的应用程序列表,以将它们放入应用程序抽屉中。因此,以下方法会在每个应用程序上运行;
问题在于这里存在瓶颈,而且不是我最初预期的图标加载问题。方法的第一行 (
在我的测试中,我注意到当较慢的设备正在进行多任务处理并且由于某种原因需要重新加载应用程序抽屉时,这个操作可能需要长达30秒才能完成(所有已安装的应用程序都要重新加载)。
缓存可能提供一个潜在的解决方案,但是如果应用程序的名称更改了怎么办(偶尔会发生)?我必须从缓存中获取标签,然后在单独的线程中循环遍历所有应用程序,并在标签更改的地方更正标签。这可能提供一个解决方案,但它似乎更像是一种肮脏的 hack 而不是一个实际的好解决方案。
有没有更快的方法来获取应用程序活动的标签?此外,为什么 Android 获取应用程序标签需要如此长时间,我能做些什么吗?
public static App fromResolveInfo (Context context, PackageManager pacMan, AppManager appManager, ResolveInfo resInf)
{
String label = resInf.loadLabel (pacMan).toString ();
String packageName = resInf.activityInfo.applicationInfo.packageName;
String activityName = resInf.activityInfo.name;
App app = new App (context, appManager);
app.setLabel (label);
app.setPackageName (packageName);
app.setActivityName (activityName);
AppIcon icon = null;
if (appManager.isIconPackLoaded ())
icon = appManager.getIconPack ().getIconForApp (app);
if (icon == null)
icon = appManager.getIconPack ().getFallbackIcon (resInf.loadIcon (pacMan));
app.setIcon (icon);
return app;
}
问题在于这里存在瓶颈,而且不是我最初预期的图标加载问题。方法的第一行 (
String label = resInf.loadLabel(pacMan).toString();
) 可以占用 0 到 250 毫秒 (在相对高端的设备上)。在旧设备上,这成为一个真正的问题。在我的测试中,我注意到当较慢的设备正在进行多任务处理并且由于某种原因需要重新加载应用程序抽屉时,这个操作可能需要长达30秒才能完成(所有已安装的应用程序都要重新加载)。
缓存可能提供一个潜在的解决方案,但是如果应用程序的名称更改了怎么办(偶尔会发生)?我必须从缓存中获取标签,然后在单独的线程中循环遍历所有应用程序,并在标签更改的地方更正标签。这可能提供一个解决方案,但它似乎更像是一种肮脏的 hack 而不是一个实际的好解决方案。
有没有更快的方法来获取应用程序活动的标签?此外,为什么 Android 获取应用程序标签需要如此长时间,我能做些什么吗?
getView()
方法中。目前,当我的应用程序启动时,我只尝试检索所有活动及其图标和标签的列表。我想这可能有关系。我从未想过以这种方式做。另一方面,我必须进行很多更改才能使该方法起作用,因此如果可能的话,最好采用不同的解决方案。 - RobinJ