如果我打电话

    PackageManager pm = getPackageManager () ;
    List<PackageInfo> pis = pm.getInstalledPackages (PackageManager.GET_PROVIDERS) ;

我得到一个已安装包的列表,包括它们声明的任何provider(即,使用pis[i].providers可能为非空)。
但是,如果我在标志中包含packagemanager.get活动,如
    PackageManager pm = getPackageManager () ;
    List<PackageInfo> pis = pm.getInstalledPackages (PackageManager.GET_ACTIVITIES | PackageManager.GET_PROVIDERS) ;

我希望得到已安装软件包的“相同”列表,但是使用pis[i],活动也不是空的。但我没有,我得到一个空名单。
documentation中没有提到的标志中包含packagemanager.get_活动有什么特别的吗?
我目前的解决方法是将packagemanager.get_activities保留在标志之外,然后按如下方式循环返回列表:
    for (PackageInfo pi : pis) {
        try {
            PackageInfo tmp = pm.getPackageInfo (pi.packageName, PackageManager.GET_ACTIVITIES) ;
            pi.activities = tmp.activities ;
            }
        catch (NameNotFoundException e) {
            Log.e (TAG, e.getMessage ()) ;
            }

但那看起来真是个大麻烦。
唯一提到getinstalledpackages(packagemanager.get_activities)返回空列表的地方是here,但在这种情况下,问题似乎是在主应用程序线程之外调用getinstalledpackages(),而在我的情况下不是这样。
P.S.这是姜饼的.602 VZW版本,以防万一

最佳答案

我遇到了同样的问题,找到了更好的解决方法:

public void listAllActivities() throws NameNotFoundException
{
    List<PackageInfo> packages = getPackageManager().getInstalledPackages(0);
    for(PackageInfo pack : packages)
    {
        ActivityInfo[] activityInfo = getPackageManager().getPackageInfo(pack.packageName, PackageManager.GET_ACTIVITIES).activities;
        Log.i("Pranay", pack.packageName + " has total " + ((activityInfo==null)?0:activityInfo.length) + " activities");
        if(activityInfo!=null)
        {
            for(int i=0; i<activityInfo.length; i++)
            {
                Log.i("PC", pack.packageName + " ::: " + activityInfo[i].name);
            }
        }
    }
}

注意,我需要查询PackageManager两次。一次使用getPackageManager().getInstalledPackages(...)并再次使用getPackageManager().getPackageInfo(...)
我希望有帮助。

09-08 05:25