intent.resolveActivity(getPackageManager())到底在做什么?

时间:2019-04-14 15:25:45

标签: java android android-intent

我正在经历the Android Developer Tutorials,遇到了我不理解的一行代码。

这是代码行(位于Android Developer教程的第4页。)

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

我有几个问题。

1)Intent.ACTION_VIEW documentation说,它只是向用户显示数据。我了解它选择的应用程序将取决于要显示的数据类型。例如,在这种情况下,网页被解析为uri数据类型。但是,这里正在创建什么样的隐式意图?在后端,我是否可以将Android视为遍历手机中的所有类,看看哪个具有可以处理数据的意图过滤器,并创建意图结构来启动它发现的此类?

2)如果它找到多个可以处理此问题的类会怎样?它只是选择默认值还是要求用户选择要在其上运行的应用程序?当我在手机上运行代码时,默认情况下,它只是启动了Samsung Internet App。

3)这实际上是我的主要问题。如果意图已经链接到要开始的课程,那么为什么还要intent.resolveActivity(getPackageManager())呢?其documentation指定了返回类时如何处理该类。好吧,返回一个类。但是,返回的此类也没有在代码的任何行中“整合”到我的intent中,这使我认为Intent.ACTION_VIEW已经以某种方式为我处理了它。

这将是一个飞跃,但是我可以肯定地说Intent.ACTION_VIEW运行intent.resolveActivity(getPackageManager())或另一个执行类似功能并以某种方式将返回的类合并到我的意图中的功能吗? / p>

4)另外,出于好奇,package manager class里面是什么?我读过here,它就像是应用程序数据的目录。我这样说是否正确?它保留有关应用程序的什么样的数据,以及如何去访问它们。该文档似乎并没有太大帮助。

1 个答案:

答案 0 :(得分:1)

  

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

嗯... ACTION_VIEW Intent,以查看请求的URL。

  

我是否可以认为Android遍历了手机中的所有类,看看哪个拥有可以处理数据的意图过滤器并创建意图结构来启动它发现的此类?

活动已在清单中注册。该操作系统基本上具有一个包含所有已注册活动及其<intent-filter>详细信息的数据库,并且使用该数据库查找任何给定隐式Intent的候选对象。

  

它只是选择默认值还是要求用户选择要在其上运行的应用程序?

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

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

  • 是否用Intent来包装Intent.createChooser()来强制选择器

  • 一个应用程序是否已经为URL注册了一个应用程序链接

  

如果已将意图链接到要启动的类,那么为什么还要去烦intent.resolveActivity(getPackageManager())?

因为可能有零个活动来处理Intent。即使对于像Web浏览器一样常见的东西,特定用户也可能无权访问浏览器应用程序(辅助用户配置文件等)。如果您尝试开始一项活动,但没有匹配项,则会得到ActivityNotFoundException,因此此检查试图避免此类异常。

  

但是我可以说Intent.ACTION_VIEW运行intent.resolveActivity(getPackageManager())或另一个功能相似并且以某种方式将返回的类合并到我的意图中的函数是正确的吗?

不是。说resolveActivity()查询我提到的数据库以查看将处理Intent(如果有的话)的内容会更正确。

  

包管理器类中包含什么?

一点点Java代码。它主要是通往核心OS进程的IPC网关,用于查询已安装应用程序及其功能等的数据库。