意图过滤优先级导致问题,当添加到Android清单深度链接时

时间:2017-05-02 08:04:49

标签: java android android-intent deep-linking

我正在尝试为我的Android应用添加深层链接。网站域名为cherishx.com

我想要深层链接的两条路径,并且都打开不同的活动

  • 路径1 - cherishx.com/experiences/some-cateogry
  • 路径2 - cherishx.com/experience/some-experience

请注意上面的主要区别,路径1有"体验 s "而路径2只是"经验" (没有s)

我写的意图过滤器如下:

<intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data android:scheme="http" />
            <data android:scheme="https" />
            <data android:host="cherishx.com" />
            <data android:pathPattern="/experiences/.*" />
        </intent-filter>

        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data android:scheme="http" />
            <data android:scheme="https" />
            <data android:host="cherishx.com" />
            <data android:pathPattern="/experience/.*" />
        </intent-filter>

有趣的是只有具有&#34;经验的意图过滤器&#34; (包括在内)每次都会被触发。除非我评论那个意图过滤器,否则&#34;经验&#34;工作正常。

无法让它发挥作用。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

要提供<data/>以外的android:scheme属性,还必须提供android:scheme"。您 *可* * 继续使用多个<data/>属性,但如果您使用android:scheme以外的任何内容,则还应包含android:scheme。例如,您可以这样做:

<intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data android:scheme="http"
          android:host="cherishx.com"
          android:pathPattern="/experience/.*" />
        <data android:scheme="https"
          android:host="cherishx.com"
          android:pathPattern="/experiences/.*" />
</intent-filter>

或者你可以这样做:

<intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data android:scheme="http" />
        <data android:scheme="https" />
</intent-filter>

但不是这样:

<intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data android:host="cherishx.com"
          android:pathPattern="/experience/.*" />
        <data android:host="cherishx.com"
          android:pathPattern="/experiences/.*" />
</intent-filter>

原因是如果没有<data/>属性,android会忽略android:scheme标记中的任何属性。此外,如果没有android:host,则忽略端口和路径属性。

根据文档[1]

  

描述:   将数据规范添加到intent过滤器。规范可以只是数据类型(mimeType属性),只是URI,或者是数据类型和URI。 URI由每个部分的单独属性指定:   <scheme>://<host>:<port>[<path>|<pathPrefix>|<pathPattern>]

     

指定URL格式的这些属性是可选的,但也是相互依赖的:

     

如果没有为intent过滤器指定方案,则忽略所有其他URI属性。   如果没有为过滤器指定主机,则忽略端口属性和所有路径属性。