2015-07-02 5 views
5

В моем приложении для замены на рабочем столе мне нужно получить список всех установленных приложений, чтобы поместить их в ящик приложения. Следовательно, следующий метод запускается в каждом приложении;Почему resolveInfo.loadLabel() настолько смехотворно медленный?

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 секунд для завершения этого действия (для всех установленных приложений).

Кэширование может предложить потенциальное решение для этого, но что, если имя приложения изменится (что изредка случается)? Я должен был бы взять метки из кеша, а затем перебрать все приложения в отдельном потоке и исправить метки, где они были изменены. Это может предложить решение, но оно кажется скорее грязным взломом, чем реальным хорошим решением.

Есть ли более быстрый способ получить ярлык активности приложения? Кроме того, почему это так смешно долго для Android, чтобы получить ярлык приложения и/или есть что-нибудь, что я могу с этим поделать?

+1

«Что делать, если имя приложения изменяется (что иногда случается)?» - прослушивать соответствующие трансляции и обновлять кеш для конкретного изменения имени. Такое изменение произойдет только при установке, обновлении или удалении приложений. «Почему так сложно дожидаться, когда Android получит ярлык приложения» - я не видел этого поведения. Вы используете Traceview, чтобы определить, что именно в этом проблема? – CommonsWare

+0

@CommonsWare Разве я не получал бы такие трансляции во время работы своего приложения? Речь идет о получении начального списка установленных приложений, которые мне нужны, когда мое приложение запущено. Мои наблюдения произошли от (несколько старомодной, возможно) компиляции временных меток между тем, когда началось действие и когда оно было закончено.^Я только что проверил через Traceview, и это показывает мне тот же вывод. Это мой первый раз, используя Traceview. Поэтому, пожалуйста, извините меня, если я неправильно интерпретирую результаты. http://stuff.robinj.be/stackoverflow/31188658-AsyncLoadApps.trace – RobinJ

+0

«Разве я не получал бы такие трансляции во время работы своего приложения?» -- да. Вам нужно будет обновить эту информацию, когда ваш процесс запустится. «Это касается получения первоначального списка установленных приложений, которые мне нужны при запуске моего приложения» - надеюсь, если вы пишете домашний экран, вы больше ориентируетесь на получение списка запускаемых действий, а не на список установленных приложений Программы. Я не испытывал проблем с производительностью, которые вы описываете с помощью [моего образца Launchalot] (https://github.com/commonsguy/cw-omnibus/tree/master/Introspection/Launchalot), и этот образец * old *. :-) – CommonsWare

ответ

0

Вы можете получить ярлык как:

String label = (String) resInf.activityInfo.applicationInfo.loadLabel(pacMan); 

Если сравнить исходный код Android для этих двух методов вы заметите один из applicationInfo имеет меньше коды для выполнения. Возможно, узкое место находится в дополнительном коде. Я лично никогда не сравнивал время исполнения для тех, поскольку я никогда не наблюдал такую ​​проблему.

+2

Это, по-моему, получило бы название фактического приложения, а не метку активности (пусковой установки). Некоторые приложения (например, Google Диск) имеют несколько действий. – RobinJ

+0

Да, он возвращает метку тега из манифеста, а не ярлыка активности запуска, но вы задали «метку приложения» в своем вопросе. – mhenryk

Смежные вопросы