通过 PackageInfo 获取具体信息方法:
包名获取方法:packageInfo.packageName
icon获取获取方法:packageManager.getApplicationIcon(applicationInfo)
应用名称获取方法:packageManager.getApplicationLabel(applicationInfo)
使用权限获取方法:packageManager.getPackageInfo(packageName,PackageManager.GET_PERMISSIONS)
.requestedPermissions
通过 ResolveInfo 获取具体信息方法:
包名获取方法:resolve.activityInfo.packageName
icon获取获取方法:resolve.loadIcon(packageManager)
应用名称获取方法:resolve.loadLabel(packageManager).toString()
用PackageManager可获取所有可启动主Activity,可启动主Activity都带有包含MAIN操作(action)和LAUNCHER类别(category)的intent过滤器(intent-filter)。即在AndroidManifest.xml文件中注册了main 和launcher的activity。
private void setupAdapter(){
Intent startupIntent = newIntent(Intent.ACTION_MAIN);
startupIntent.addCategory(Intent.CATEGORY_LAUNCHER);
/**使用了Fragment,所以调用getActivity()获取当前上下文Context**/
final PackageManager packageManager = getActivity().getPackageManager();
/**获取匹配的activity列表**/
List<ResolverInfo> activities = packageManager.queryIntentActivities(startupIntent,0);
}
##获取启动应用后与未卸载比较
public List<AppInfo> queryFilterAppInfo() {
pm = context.getPackageManager();
// 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent
Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
// 通过getPackageManager()的queryIntentActivities方法遍历,得到所有能打开的app的packageName
List<ResolveInfo> resolveinfoList = pm.queryIntentActivities(resolveIntent, 0);
Set<String> allowPackages=new HashSet();
for (ResolveInfo resolveInfo:resolveinfoList){
allowPackages.add(resolveInfo.activityInfo.packageName);
}
debug("allowPackages = " + allowPackages);
// 查询所有已经安装的应用程序,GET_UNINSTALLED_PACKAGES代表已删除,但还有安装目录的
List<ApplicationInfo> applicationInfos = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
List<AppInfo> appInfos = new ArrayList<AppInfo>();
for (ApplicationInfo info : applicationInfos) {
if (allowPackages.contains(info.packageName)){
AppInfo appInfo = new AppInfo();
//获取应用的名称
String app_name = info.loadLabel(pm).toString();
appInfo.setApp_name(app_name);
//获取应用的包名
String packageName = info.packageName;
appInfo.setPackagename(packageName);
appInfos.add(appInfo);
}
}
debug("appInfos = " + appInfos);
return appInfos;
}
要创建启动activity的显示intent,需要从ResolveInfo对象中获取activity的包名与类名,这些信息可以从ResolveInfo对象的ActivityInfo中获取。下面创建一个显示intent并启动目标activity
public void onClick(View v) {
/**mResolveInfo就是之前获取的activities**/
ActivityInfo activityInfo = mResolveInfo.activityInfo;
Intent i = newIntent(Intent.ACTION_MAIN)
.setClassName(activityInfo.applicationInfo.packageName, activityInfo.name)
/**为了在启动新activity时启动新任务,需要为intent添加一个标志
FLAG_ACTIVITY_NEW_TASK标志控制每个activity仅创建一个任务**/
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
ResolveInfo类
说明:根据<intent>节点来获取其上一层目录的信息,通常是<activity>、<receiver>、<service>节点信息。
常用字段:
public ActivityInfo activityInfo 获取 ActivityInfo对象,即<activity>或<receiver >节点信息
public ServiceInfo serviceInfo 获取 ServiceInfo对象,即<service>节点信息
常用方法:
Drawable loadIcon(PackageManager pm) 获得当前应用程序的图像
CharSequence loadLabel(PackageManager pm) 获得当前应用程序的label