Android 清单中的意图过滤器可以包含多少个方案和主机标签

问题描述 投票:0回答:3
android android-manifest host intentfilter
3个回答
18
投票

我知道我们可以用两种形式指定数据

请勿将

content
用于方案,除非您确实是想创建一项活动来支持
ContentProvider

但是我想知道是否可以存在几种组合

如果您的过滤器只有一个

<data>
属性,您肯定可以有不同的值,例如联系人应用程序中的值:

    <activity
        android:name=".activities.ShowOrCreateActivity"
        android:theme="@android:style/Theme.Translucent.NoTitleBar">

        <intent-filter>
            <action android:name="com.android.contacts.action.SHOW_OR_CREATE_CONTACT" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="mailto" />
            <data android:scheme="tel" />
        </intent-filter>
    </activity>

此外,一个组件可以有多个

<intent-filter>
元素,每个元素都与其他元素进行逻辑或运算(任何与任何过滤器匹配的
Intent
都是该组件的匹配项)。因此,对于更复杂的场景,每个
<data>
元素有 2 个以上属性,我倾向于将它们放在单独的
<intent-filter>
元素中。

如何决定哪个主机用于哪个方案

任何匹配都被认为是好的。您可以自己检查

Intent
以了解有关其包含内容的更多信息。


16
投票

补充@CommonsWare答案,如果你不那么具体,你似乎不能使用两个

<data>
标签。

A)在我的一个应用程序中,我可以:

<data android:scheme="myAppScheme1"/>

B)并且

<data android:scheme="myAppScheme2" android:host="host2"/>

C) 但以下内容将忽略第一个标签(使用

myAppScheme1://whatever
URI 不起作用):

<data android:scheme="myAppScheme1"/>
<data android:scheme="myAppScheme2" android:host="host2"/>

D)但是,如果我补充第一个方案,它将适用于两个 URIS:

<data android:scheme="myAppScheme1" android:host="host1"/>
<data android:scheme="myAppScheme2" android:host="host2"/>

也许如果你真的需要案例 C),你最好创建两个意图过滤器


0
投票

考虑将数据标签拆分为具有单独属性的多个标签,以避免混淆。

标签应该只声明一个唯一属性(即方案或主机,但不能同时声明两者)。这更好地匹配意图过滤器的运行时行为,因为它们将所有声明的数据属性组合到单个匹配器中,该匹配器允许处理跨属性类型的任何组合。例如,以下两个声明是相同的:

<intent-filter>    
  <data android:scheme="http" android:host="example.com" />    
  <data android:scheme="https" android:host="example.org" />
</intent-filter>

<intent-filter>    
  <data android:scheme="http"/>    
  <data android:scheme="https"/>    
  <data android:host="example.com" />    
  <data android:host="example.org" />
</intent-filter>

他们都处理以下所有事情:

第二个更好地传达了组合行为,并且对外部读者来说更清楚,人们不应该依赖于自包含的方案/主机。在第一个中,http://example.org 也匹配并不明显,这可能会导致一组更复杂的方案/主机的混乱(或不正确的行为)。请注意,这不适用于主机+端口,因为它们必须在同一标签中声明并且仅彼此关联。

问题 ID:IntentFilterUniqueDataAttributes

更多信息:https://developer.android.com/guide/components/intents-filters

供应商:Android开源项目

联系方式:https://groups.google.com/g/lint-dev

反馈:https://issuetracker.google.com/issues/new?component=192708

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.