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

我回答了
this question关于为什么setType()和setData()不能一起工作的原因.我仍然找不到任何理由.逻辑逃避了我.

来自文档:Intent Documentation

To set only the data URI, call setData(). To set only the MIME type, call setType(). If necessary, you can set both explicitly with setDataAndType().

Caution: If you want to set both the URI and MIME type, do not call setData() and setType() because they each nullify the value of the other. Always use setDataAndType() to set both URI and MIME type.

最佳答案 您需要阅读源代码,但可能是因为以下原因.

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

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

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

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

setData可以执行如下操作:

field = data & 0x0F;

正如您所看到的,它也完全覆盖了字段.

setDataAndType()然后必须做类似的事情:

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

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

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

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

点赞