ResolveInfo:查询意图

QuibblerQuibbler 2020-04-11 约 8 分钟 1842 次阅读

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()

相关博客:

        ResolveInfo的用法

        Android之ResolveInfo

        关于ResolveInfo的一些小记载

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w