Android中的PackageManager提供重复项

时间:2013-05-02 22:37:13

标签: android android-package-managers

我可能是一名新手程序员但是PackageManager很复杂! 我要向你展示的内容毫无意义:

我可以在设备上提取应用程序的名称,但是如果我尝试保存到数组,那么我只能保存其中的一半。

        PackageManager packageManager = null;
    List<ApplicationInfo> appsListTest = new ArrayList<ApplicationInfo>();
    packageManager = context.getPackageManager();
    appsListTest = packageManager.getInstalledApplications(0);
    Log.d("LOG", " New PM : " + appsListTest.size());

    Iterator<ApplicationInfo> iterator = appsListTest.iterator();
    int counter = 0;
    String[] appName = new String[appsListTest.size()];
    while (iterator.hasNext()) {

        Log.d("LOG", String.valueOf(counter));
    //  When I print out by itself I see 64 apps. Great
        Log.d("LOG", (String) iterator.next().loadLabel(packageManager));
    //  Now when I try to save to array I only get 30
                    appName[counter] = (String) iterator.next().loadLabel(packageManager);
        counter++;


    }

没有意义!!!

因此,如果我注释掉appName数组,我将打印出61次Log.d。 但是当我包含那个数组时,我只会注销31次。

我初始化appName的值是64:

Log.d("LOG", " New PM : " + appsListTest.size());

应用程序不会崩溃或任何事情。

有人能告诉我一些如何获取应用名称,uid和图标的代码吗?

1 个答案:

答案 0 :(得分:0)

iterator.next()推进列表 - 你每循环推进两次。相反,您应该将iterator.next()的结果保存为变量,然后在循环中使用它:

while (iterator.hasNext()) {
    Log.d("LOG", String.valueOf(counter));
    // Only call iterator.next() once per loop
    ApplicationInfo info = iterator.next();
    String label = (String) info.loadLabel(packageManager);
    Log.d("LOG", label);
    appName[counter] = label;
    counter++;
}