[英]Why does intent.resolveActivity(getPackageManager()) return null even though there is Activity to handle it?
[英]What exactly is intent.resolveActivity(getPackageManager()) doing?
我正在阅读Android 开发人员教程<\/a>,遇到了一行我不理解的代码。
这是代码行(可在 Android 开发者教程的第 4 页找到。)
Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
但是,这里正在创建什么样的隐式意图?
嗯... ACTION_VIEW
Intent
,用于查看请求的URL。
我是否可以将Android视为遍历手机中的所有类,看看哪个具有可以处理数据的意图过滤器并创建意图结构以启动它发现的此类?
活动在清单中注册。 操作系统基本上具有所有已注册活动及其<intent-filter>
详细信息的数据库,并且使用该数据库查找任何给定隐式Intent
候选对象。
它只是选择默认值还是要求用户选择要在其上运行的应用程序?
这取决于多种因素,包括:
用户是否为这种Intent
选择了默认处理程序(例如,选择了默认的Web浏览器)
是否使用Intent.createChooser()
包装Intent
以强制选择器
应用程序是否已为URL注册了应用程序链接
如果该意图已经链接到要启动的类,那么为什么还要打扰intent.resolveActivity(getPackageManager())呢?
因为可能有零个活动来处理Intent
。 即使对于像Web浏览器一样常见的东西,特定用户也可能无权访问浏览器应用程序(辅助用户配置文件等)。 如果尝试启动活动,但没有匹配项,则会收到ActivityNotFoundException
,因此此检查试图避免此类异常。
但是我可以说Intent.ACTION_VIEW运行intent.resolveActivity(getPackageManager())或另一个类似但又以某种方式将返回的类合并到我的意图中的函数是否正确?
并不是的。 如果说resolveActivity()
查询我提到的数据库以查看将处理Intent
(如果有的话),那将是更正确的说法。
包管理器类里面有什么?
一点Java代码。 它主要是通往核心OS进程的IPC网关,用于查询已安装应用程序及其功能等的数据库。
顺便说一句,由于添加了新限制,此方法可以在 Android 11 及更高版本上返回 null: https<\/a> :\/\/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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.