本周早些时候,我问了一个类似的问题,但我仍然不明白如何获得所有已安装的应用程序的列表,然后选择一个运行。
我试过了:
Intent intent = new Intent(ACTION_MAIN);
intent.addCategory(CATEGORY_LAUNCHER);
这只显示预安装或可以运行ACTION_MAIN Intent类型的应用程序。
我也知道我可以使用PackageManager来获取所有已安装的应用程序,但我如何使用它来运行特定的应用程序呢?
本周早些时候,我问了一个类似的问题,但我仍然不明白如何获得所有已安装的应用程序的列表,然后选择一个运行。
我试过了:
Intent intent = new Intent(ACTION_MAIN);
intent.addCategory(CATEGORY_LAUNCHER);
这只显示预安装或可以运行ACTION_MAIN Intent类型的应用程序。
我也知道我可以使用PackageManager来获取所有已安装的应用程序,但我如何使用它来运行特定的应用程序呢?
当前回答
我有另一个解决方案:
ArrayList<AppInfo> myAppsToUpdate;
// How to get the system and the user apps.
public ArrayList<AppInfo> getAppsToUpdate() {
PackageManager pm = App.getContext().getPackageManager();
List<ApplicationInfo> installedApps = pm.getInstalledApplications(0);
myAppsToUpdate = new ArrayList<AppInfo>();
for (ApplicationInfo aInfo : installedApps) {
if ((aInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
// System apps
} else {
// Users apps
AppInfo appInfo = new AppInfo();
appInfo.setAppName(aInfo.loadLabel(pm).toString());
appInfo.setPackageName(aInfo.packageName);
appInfo.setLaunchActivity(pm.getLaunchIntentForPackage(aInfo.packageName).toString());
try {
PackageInfo info = pm.getPackageInfo(aInfo.packageName, 0);
appInfo.setVersionName(info.versionName.toString());
appInfo.setVersionCode("" + info.versionCode);
myAppsToUpdate.add(appInfo);
} catch (NameNotFoundException e) {
Log.e("ERROR", "we could not get the user's apps");
}
}
}
return myAppsToUpdate;
}
其他回答
获取已安装的非系统应用程序列表
public static void installedApps()
{
List<PackageInfo> packList = getPackageManager().getInstalledPackages(0);
for (int i=0; i < packList.size(); i++)
{
PackageInfo packInfo = packList.get(i);
if ( (packInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0)
{
String appName = packInfo.applicationInfo.loadLabel(getPackageManager()).toString();
Log.e("App № " + Integer.toString(i), appName);
}
}
}
@Jas: 我没有那个代码了,但我找到了一些接近的东西。我已经做了这个来搜索我的应用程序的“组件”,它们只是具有给定类别的活动。
private List<String> getInstalledComponentList() {
Intent componentSearchIntent = new Intent();
componentSearchIntent.addCategory(Constants.COMPONENTS_INTENT_CATEGORY);
componentSearchIntent.setAction(Constants.COMPONENTS_INTENT_ACTION_DEFAULT);
List<ResolveInfo> ril = getPackageManager().queryIntentActivities(componentSearchIntent, PackageManager.MATCH_DEFAULT_ONLY);
List<String> componentList = new ArrayList<String>();
Log.d(LOG_TAG, "Search for installed components found " + ril.size() + " matches.");
for (ResolveInfo ri : ril) {
if (ri.activityInfo != null) {
componentList.add(ri.activityInfo.packageName);// + ri.activityInfo.name);
Log.d(LOG_TAG, "Found installed: " + componentList.get(componentList.size()-1));
}
}
return componentList;
}
我已经注释了它获取活动名称的部分,但它非常简单。
我有另一个解决方案:
ArrayList<AppInfo> myAppsToUpdate;
// How to get the system and the user apps.
public ArrayList<AppInfo> getAppsToUpdate() {
PackageManager pm = App.getContext().getPackageManager();
List<ApplicationInfo> installedApps = pm.getInstalledApplications(0);
myAppsToUpdate = new ArrayList<AppInfo>();
for (ApplicationInfo aInfo : installedApps) {
if ((aInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
// System apps
} else {
// Users apps
AppInfo appInfo = new AppInfo();
appInfo.setAppName(aInfo.loadLabel(pm).toString());
appInfo.setPackageName(aInfo.packageName);
appInfo.setLaunchActivity(pm.getLaunchIntentForPackage(aInfo.packageName).toString());
try {
PackageInfo info = pm.getPackageInfo(aInfo.packageName, 0);
appInfo.setVersionName(info.versionName.toString());
appInfo.setVersionCode("" + info.versionCode);
myAppsToUpdate.add(appInfo);
} catch (NameNotFoundException e) {
Log.e("ERROR", "we could not get the user's apps");
}
}
}
return myAppsToUpdate;
}
另一种过滤系统应用程序的方法(适用于king9981的例子):
/**
* Return whether the given PackageInfo represents a system package or not.
* User-installed packages (Market or otherwise) should not be denoted as
* system packages.
*
* @param pkgInfo
* @return
*/
private boolean isSystemPackage(PackageInfo pkgInfo) {
return ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
}
过滤基于系统的应用程序:
private boolean isSystemPackage(ResolveInfo ri) {
return (ri.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
}