2016-02-18 50 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