问题描述
根据this -
<activity
android:name="com.example.android.GizmosActivity"
android:label="@string/title_gizmos" >
<intent-filter android:label="@string/filter_view_http_gizmos">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.broWSABLE" />
<!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
<data android:scheme="http"
android:host="www.example.com"
android:pathPrefix="/gizmos" />
<!-- note that the leading "/" is required for pathPrefix-->
</intent-filter>
<intent-filter android:label="@string/filter_view_example_gizmos">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.broWSABLE" />
<!-- Accepts URIs that begin with "example://gizmos” -->
<data android:scheme="example"
android:host="gizmos" />
</intent-filter>
</activity>
关于第一个 Intent 过滤器,我知道当点击链接是“http://www.example.com/gizmos”时,它将重定向到带有该 Intent 过滤器的应用程序页面。 但是关于第二个意图过滤器“example://gizmos”,这看起来不像一个有效的网址,没有有效的网址以此开头。那么为什么应用程序使用这种意图过滤器?我见过很多这样的类型意图过滤器的组合主机和方案不能形成正确的 web url。我知道文档提到它作为 URI 而不是 URL。如何可以打开像“example://gizmos”这样的 URI?这样的 URI 可以从打开外部应用?
解决方法
您是否测试过这个 example://gizmos
URI?例如放在某个网站上,然后在某个 Web 浏览器中单击链接打开?或者通过在您的代码中放置一些按钮并尝试在 Intent.createChooser
onClick
的默认选择器打开此方案
请注意,当您获得 http://
链接时,例如一些消息并单击它然后系统将显示选择器:您的应用程序和网络浏览器,因为这些类型的应用程序已声明可使用 scheme="http"
打开而没有任何进一步限制(例如 host
值)。当您点击 example
方案时,默认选择器将查找声明它可以打开此类链接的应用程序,如果没有您的应用程序,它将显示此链接不可“打开”,因此这是仅限应用程序的链接
顺便说一句。这不是目前最好的方法,它在本机级别上效果最好 - 在两个本机应用程序之间进行通信并检查另一端是否已安装 - 不适用于与网络链接混合。最好是集成 App Linking (实际上是扩展的深层链接)。此模式仅适用于网络 scheme
(如 http
或 https
),但如果安装(如果没有,则保留在网络上)并且服务器正在声明,可以自动从浏览器重定向到您的应用该 Web URI 可以/应该重定向到本机应用程序
请注意,还有其他默认的非网络 scheme
,例如众所周知的 mailto:<mail_address>
或 tel:<number>
- 工作方式相同:系统将寻找声明可以打开此类 URI 的应用.这些不会被网络浏览器处理,这些不是网络协议