我回答了 this question 为什么 setType() 和 setData() 不能一起工作。我仍然找不到任何原因。这个逻辑使我无法理解。
来自文档:Intent Documentation

最佳答案

您需要阅读源代码,但这可能是因为以下原因。

setType()、setData() 和 setDataAndType() 都对单个数据字段进行操作。字段实际上是类型和数据两个字段的组合。其中类型占据一个部分而数据占据另一部分。所以说字段是16位,输入高8位,数据低8位。

setType() 可以做这样的操作:

field = (type & 0x0F) << 8;

如您所见,它完全覆盖了字段。所以不管之前有什么,它现在只包含类型信息。

setData 可能会执行这样的操作:
field = data & 0x0F;

如您所见,它也完全覆盖了字段。

setDataAndType() 然后必须执行以下操作:
field = ((type & 0x0F) << 8) || (data & 0x0F);

虽然它完全覆盖了字段,但它允许在一次调用中设置数据和类型。

至于为什么事情是这样的——可能是两个原因之一:
  • 向后兼容性。 setType 和 setData 是在没有预料到有人可能想要同时执行这两个操作的情况下编写的(或者甚至有一个用例)。在 future 的某个时候,需求或用例发生了变化。但是,应用程序已经根据这种行为进行编写。因此,为了避免破坏它们,他们引入了一种新方法而不是重载现有方法。
  • 这样比较好。 setType() 和 setData() 被故意设计为具有破坏性,以防止用户意外编写难以追踪和理解的错误。这样,有人不能调用 setType(),然后用 setData() 指定不兼容的数据,让 URI 在一个上下文中工作,但稍后会意外失败。相反,界面迫使用户明确他们想要什么。
  • 关于Android:关于 Intent ,为什么 setType() 和 setData() 相互抵消?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30850694/

    10-10 07:11