2016-02-18 16 views
1

我不太了解数据字段意图的真正目的。意图 - setData vs Extras

我已经看到类似下面的一些例子:

Intent intent = new Intent(Intent.ACTION_CALL); 
     intent.setData(Uri.parse("tel:"+number)); 
     startActivity(intent); 

所以从文档好像数据只是给你的URI,基本上在数据所在的位置。

不能所有事情都是用putExtra来完成的,只是让Activity得到额外的。

对于上面的示例,您可以将电话号码放在额外的位置,让活动获得额外的拨号。您什么时候可以使用setData vs putExtra

+1

setData()用于指向数据对象的位置(例如文件),而putExtra()添加简单数据类型Ref:http://stackoverflow.com/questions/18794504/intent-setdata -vs-intent-putextra#answer-21363437 – Sachin

+0

@Sachin,但它似乎并不总是这样,因为在我的例子中它是一个字符串。如果你无法putExtra,你会只使用setData吗?因为putExtra可以接受更复杂的数据类型,只要它是Parcelable – Alan

回答

4

不能使用putExtra完成所有事情,只是让Activity获得额外的功能。

附加功能不控制路由Intents。操作字符串,数据(Uri),MIME类型和类别。额外只是有效载荷。

在这种情况下,一个tel:UriACTION_CALL可能不同于一个sip:UriACTION_CALL处理。只有SIP兼容的VOIP客户端才能处理后者。因此,电话相关应用程序的活动可以在其元素中包含详细信息,以便仅查看可以处理的方案(以及其他可能的约束条件)。

+0

所以setData的一个关键优势是系统能够确定MIME类型并且帮助它路由而不是针对'sip:'和'tel:'调用有不同的意图? – Alan

+1

@Alan:恩,我不会那样说。 “意图”中只有一个“Uri”,因此根据定义,“SIP”和“电话:”呼叫“会有不同意图。另外,tel:'Uri'没有MIME类型。活动的''等可以根据需要进行过滤。在这种情况下,在其元素中使用ACTION_CALL的活动可能会包含该方案作为该过滤器的一部分。 – CommonsWare

0

putExtra实际上在意图中添加了数据。当它被发送到另一个被反序列化的活动时,它会被序列化。这些昂贵的操作可能会影响性能。对于可以像这样发送多少数据也有限制。如果你有一大块数据(几MB),那么最好使用setData而不是putExtra。

+0

有意义,但这是否意味着只有在数据存储在设备(如文件系统中的PDF)或Web链接时才能使用setData? – Alan

+0

您也可以将数据放入内存缓存中,并将该密钥作为意向数据传递给缓存。 – greenrobo