“intent.resolveActivity(getPackageManager())”是什么意思?

18

我正在学习Android开发教程,遇到了一行不理解的代码。

这就是那行代码(在Android开发教程的第四页找到)。

    Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }

我有几个问题。

1)Intent.ACTION_VIEW文件说明它只是将数据显示给用户。我明白它选择的应用程序取决于要显示的数据类型。例如,在这种情况下,网页被解析为uri数据类型。但是在此处创建了什么样的隐式意图?在后端中,我可以认为Android会浏览我手机中的所有类,并查看哪一个有可能处理数据的意图过滤器,并创建启动找到的类的意图结构吗?

2)如果找到多个可以处理它的类,会发生什么?它是否只选择默认值或要求用户选择要运行的应用程序?当我在我的手机上运行代码时,它只是默认启动三星互联网应用程序。

3)这实际上是我的主要问题。如果意图已经链接到要启动的类,那么为什么要使用 intent.resolveActivity(getPackageManager()) 呢? 它的文档指定了它如何处理返回类。所以好吧,类被返回。但是,它返回的这个类在我的任何代码行中都没有“合并”到我的 intent 中,这让我认为 Intent.ACTION_VIEW 已经为我处理了它。

这可能有些牵强,但是我是否可以这样说: Intent.ACTION_VIEW 运行了 intent.resolveActivity(getPackageManager()) 或另一个类似的函数,并且在某种程度上将其返回的类合并到我的意图中?

4)此外,出于好奇,包管理器类中有什么?我在这里看到它就像一个应用程序数据目录。我这样说对吗?它保存有关应用程序的哪些数据,以及如何访问它们。文档似乎没有提供太多帮助。

2个回答

29

这里创建的是什么样的隐式意图?

嗯...是一个ACTION_VIEW Intent,用于查看所请求的URL。

我可以把Android想象成遍历我的手机中的所有类,并查看哪个类具有可能处理数据的intent filter,然后创建启动找到的这个类的intent结构吗?

活动在清单文件中注册。操作系统基本上有一个包含所有注册活动及其 intent-filter 详细信息的数据库,并使用该数据库来为任何给定的隐式Intent 找到候选项。

它只选择默认值还是要求用户选择要在哪个应用程序中运行?

这取决于多种因素,包括:

  • 用户是否为那种类型的Intent选择了默认处理程序(例如,选择了默认的Web浏览器)

  • 您是否使用Intent.createChooser()包装Intent以强制使用chooser

  • 是否有应用程序为该URL注册应用程序链接

如果Intent已经链接到一个要启动的类,为什么还要使用intent.resolveActivity(getPackageManager())?

由于可能没有活动来处理Intent。即使对于像Web浏览器这样的常见应用程序,特定用户可能无法访问浏览器应用程序(辅助用户配置文件等)。如果尝试启动活动,并且没有匹配项,则会收到ActivityNotFoundException异常,因此此检查尝试避免此类异常。

但是我是否可以说Intent.ACTION_VIEW运行intent.resolveActivity(getPackageManager())或执行类似功能并将其返回的类合并到我的意图中?

不完全正确。更准确地说,resolveActivity()查询我提到的数据库以查看是否有任何内容可以处理Intent

包管理器类中有什么东西?

一些Java代码。它主要是一个IPC网关,用于查询已安装应用程序及其功能等的数据库,以服务于核心操作系统进程。


6

顺便提一下,这种方法在Android 11及更高版本中可能返回null,这是由于新增的限制所导致的:https://developer.android.com/about/versions/11/privacy/package-visibility。因此,为了解决这个问题,我们必须在清单文件下添加一个查询:

<queries>
    <intent>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="https" />
    </intent>
</queries>

如果找不到查询项,请不要忘记更新Gradle插件:

classpath("com.android.tools.build:gradle:3.5.4")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接