ResolveInfo:查询意图
ResolveInfo这个类是通过解析一个与IntentFilter相对应的intent得到的信息。它部分地对应于从AndroidManifest.xml的< intent>标签收集到的信息。PackageManager这个类是用来返回各种的关联了当前已装入设备了的应用的包的信息。你可以通过getPacageManager来得到这个类。
1、查询可处理Intent的ResolveInfo
通过Intent意图启动Activity如果这个Activity不存在,或者没有可以处理当前Intent的组件,就会报错奔溃。
1.1、queryIntentActivities查询ResolveInfo
这时候可以借助PackageManager的queryIntentActivities(Intent intent,int flags)方法查询是否有可以处理Intent的组件。
/**
* Retrieve all activities that can be performed for the given intent.
*
* @param intent The desired intent as per resolveActivity().
* @param flags Additional option flags to modify the data returned. The
* most important is {@link #MATCH_DEFAULT_ONLY}, to limit the
* resolution to only those activities that support the
* {@link android.content.Intent#CATEGORY_DEFAULT}. Or, set
* {@link #MATCH_ALL} to prevent any filtering of the results.
* @return Returns a List of ResolveInfo objects containing one entry for
* each matching activity, ordered from best to worst. In other
* words, the first item is what would be returned by
* {@link #resolveActivity}. If there are no matching activities, an
* empty list is returned.
*/
@NonNull
public abstract List<ResolveInfo> queryIntentActivities(@NonNull Intent intent,
@ResolveInfoFlags int flags);比如获取可以打开的应用集合,详见本机APP扫描、打开第三方APP、卸载。
PackageManager packageManager = getPackageManager();
Intent intent = new Intent();
List<ResolveInfo> resolves = packageManager.queryIntentActivities(intent, 0);返回List<ResolveInfo>集合,如果有对应的意图处理,则继续。
if (resolves.size() == 0) {
return;
} else {
//
}1.2、查询flag
查询可以处理Intent的方法中,第二个参数flag用于修改返回数据的附加选项标志。可选值有如下:
/** @hide */
@IntDef(flag = true, prefix = { "GET_", "MATCH_" }, value = {
GET_META_DATA,
GET_RESOLVED_FILTER,
GET_SHARED_LIBRARY_FILES,
MATCH_ALL,
MATCH_DEBUG_TRIAGED_MISSING,
MATCH_DISABLED_COMPONENTS,
MATCH_DISABLED_UNTIL_USED_COMPONENTS,
MATCH_DEFAULT_ONLY,
MATCH_DIRECT_BOOT_AUTO,
MATCH_DIRECT_BOOT_AWARE,
MATCH_DIRECT_BOOT_UNAWARE,
MATCH_SYSTEM_ONLY,
MATCH_UNINSTALLED_PACKAGES,
MATCH_INSTANT,
GET_DISABLED_COMPONENTS,
GET_DISABLED_UNTIL_USED_COMPONENTS,
GET_UNINSTALLED_PACKAGES,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ResolveInfoFlags {}最重要的是MATCH_DEFAULT_ONLY,将解析限制为仅支持Intent.CATEGORY_DEFAULT的活动。或者通常情况设置为MATCH_ALL来防止对结果进行任何过滤,查询所有能处理该Intent的Activity。
2、其它方法介绍
ResolveInfo中有很多成员变量和方法,通过它们获取有用的一些信息:
//Activity获取方法
resolve.activityInfo.name
//Activity包名获取方法
resolve.activityInfo.packageName
//App包名获取方法
resolve.activityInfo.applicationInfo.packageName
//icon获取获取方法
resolve.loadIcon(packageManager)
//应用名称获取方法
resolve.loadLabel(packageManager).toString()相关博客:

