2012-04-05 4 views
1

Ich habe diesen Code, um Symbol und Anwendungsname zu laden, aber es ist langsam für mehr als 50 Anwendung und es dauert 7-8 Sekunden zu laden, wie Anwendungsname und Symbol schneller laden?Wie kann die Ladegeschwindigkeit von Symbolen und Anwendungsnamen verbessert werden?

private void loadApps() { 
      Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
      mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
      InternalDataManager.apps = getPackageManager() 
        .queryIntentActivities(mainIntent, 0); 
      PackageManager pm = getPackageManager(); 

      for (int i = 0; i < InternalDataManager.apps.size(); i++) { 

       ResolveInfo info = InternalDataManager.apps.get(i); 

          // PInfo holds name and icon 
       PInfo infoP = new InternalDataManager.PInfo(); 

       infoP.appname = info.activityInfo.applicationInfo.loadLabel(pm) 
         .toString(); 


       infoP.icon = info.activityInfo.loadIcon(pm); 

       infoP.pname = info.activityInfo.applicationInfo.packageName; 



      } 
     } 
+0

Dieser Code sollte ein paar Millisekunden dauern. Wie haben Sie festgestellt, dass dieser Block Ihr Problem ist? Was hat Traceview Ihnen im Hinblick auf die spezifischen Anrufe, die langsam waren, aufgezeigt? – CommonsWare

+0

Load Icons nehmen Zeiten, wirklich mal – Ata

+0

'loadIcon()' sollte sehr wenig Zeit in Anspruch nehmen. Dieses Beispielprojekt kann im Handumdrehen einen '' ListView' 'erzeugen, der mit abschießbaren Elementen gefüllt ist: https://github.com/commonsguy/cw-advandroid/tree/master/Introspection/Launchalot – CommonsWare

Antwort

1

Diese Hilfsfunktion ruft alle installierten Anwendungen mit dem Anwendungsnamen, Paketname, Versionsnummer und -Code sowie die Symbole. Die Methode getPackages() gibt eine ArrayList mit allen Apps zurück. Sie sollten dies versuchen ...

class PInfo { 
    private String appname = ""; 
    private String pname = ""; 
    private String versionName = ""; 
    private int versionCode = 0; 
    private Drawable icon; 
    private void prettyPrint() { 
     Log.v(appname + "\t" + pname + "\t" + versionName + "\t" + versionCode); 
    } 
} 

private ArrayList<PInfo> getPackages() { 
    ArrayList<PInfo> apps = getInstalledApps(false); /* false = no system packages */ 
    final int max = apps.size(); 
    for (int i=0; i<max; i++) { 
     apps.get(i).prettyPrint(); 
    } 
    return apps; 
} 

private ArrayList<PInfo> getInstalledApps(boolean getSysPackages) { 
    ArrayList<PInfo> res = new ArrayList<PInfo>();   
    List<PackageInfo> packs = getPackageManager().getInstalledPackages(0); 
    for(int i=0;i<packs.size();i++) { 
     PackageInfo p = packs.get(i); 
     if ((!getSysPackages) && (p.versionName == null)) { 
      continue ; 
     } 
     PInfo newInfo = new PInfo(); 
     newInfo.appname = p.applicationInfo.loadLabel(getPackageManager()).toString(); 
     newInfo.pname = p.packageName; 
     newInfo.versionName = p.versionName; 
     newInfo.versionCode = p.versionCode; 
     newInfo.icon = p.applicationInfo.loadIcon(getPackageManager()); 
     res.add(newInfo); 
    } 
    return res; 
} 
+0

es alle Dienste und andere Aktivitäten auflisten, brauche ich Launcher Aktivitäten – Ata

+0

Ich stimme mit Ata 1. Code dauert 24 sek. Nimits-Code dauert 18 Sekunden. Aber immer noch ohne packageManager ist 200 Millisekunden. – Tefel

Verwandte Themen