我知道我们可以用两种形式指定数据
请勿将
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
以了解有关其包含内容的更多信息。
补充@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),你最好创建两个意图过滤器
考虑将数据标签拆分为具有单独属性的多个标签,以避免混淆。
标签应该只声明一个唯一属性(即方案或主机,但不能同时声明两者)。这更好地匹配意图过滤器的运行时行为,因为它们将所有声明的数据属性组合到单个匹配器中,该匹配器允许处理跨属性类型的任何组合。例如,以下两个声明是相同的:
<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