Android:关于Intents,为什么setType()和setData()互相无效?

时间:2015-06-15 16:52:16

标签: android android-intent

我回答this question关于为什么setType()和setData()不能一起工作。我仍然找不到任何理由。逻辑躲过了我。

来自文档:Intent Documentation

  

要仅设置数据URI,请调用setData()。要仅设置MIME类型,请调用setType()。如有必要,您可以使用setDataAndType()显式设置它们。

     

警告:如果要同时设置URI和MIME类型,请不要调用setData()和setType(),因为它们都会使另一个的值无效。始终使用setDataAndType()来设置URI和MIME类型。

1 个答案:

答案 0 :(得分:2)

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

setType(),setData()和setDataAndType()都在单个数据字段上运行。该字段实际上是两个字段,类型和数据的组合。类型占据一个部分,数据占另一部分。所以说该字段是16位,键入高8位,数据低8位。

setType()可以执行如下操作:

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

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

setData可以执行如下操作:

field = data & 0x0F;

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

然后

setDataAndType()必须执行以下操作:

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

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

至于为什么事情就是这样 - 可能是以下两个原因之一:

  1. 向后兼容性。编写setType和setData时没有预料到有人可能想要同时执行这两个操作(或者甚至是这样的用例)。在将来的某个时候,该要求或用例发生了变化。但是,应用程序已经开始依赖于该行为。因此,为了避免破坏它们,他们引入了一种新方法而不是重载现有方法。
  2. 这种方式更好。 setType()和setData()被故意设计为具有破坏性,以防止用户意外地编写难以追查和理解的错误。这样,有人无法调用setType(),然后使用setData()指定不兼容的数据,让URI在一行中工作,但稍后会失败意外。相反,界面会强制用户明确他们想要的内容。