我可能是一名新手程序员但是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和图标的代码吗?
答案 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++;
}