2017-02-26 109 views
0

我有一個實現Parcelable接口的對象。Bundle.putParcelable(String key,Parcelable value)和Intent.putExtra(String name,Parcelable value)差異

案例1:

我有一個活動A和B.我想從一個物體傳遞使用Intent.putExtra(String name, Parcelable value)所以在活動B,當我得到對象到B和改變一些領域,並得到回A對象的領域保持不變。這意味着通過Intent.putExtra(String name, Parcelable value)傳遞對象後,將創建一個新的對象實例。

案例2:

我有一個包含對象列表的活動,也是活動具有ViewPager與片段。我創建片段並傳遞給它對象Bundle.putParcelable(String key, Parcelable value)因此,當我獲取對象並更改某些字段(int Fragment)時,放置在列表中(在Activity中)的對象也發生了更改。所以這意味着對象還沒有被創建,只是引用已經傳遞給fragment。

有人可以解釋一下關於Bundle.putParcelable(String key, Parcelable value)Intent.putExtra(String name, Parcelable value)的奇怪行爲嗎?

回答

1

那是因爲Intent機制和set/getArguments()Fragment工作方式不同。

Activity包含Fragment它具有直接引用Fragment,和上Fragment設定束是Fragment對象上簡單的設置,這是指該包對象的引用,但活動是一樣的一個在Fragment。其實你不一定需要這種機制,因爲你可能會控制Fragments並知道它們的類型,所以你可以通過在Fragment上暴露一個方法來傳遞參數。好處和意圖的相似之處在於使用提供的set/getArguments()保留了片段銷燬和創建的那些參數,它使用BundleParcelable,它們是系統可以在控制之外存儲的數據。

但是,IntentActivity是不同的,Activity沒有對象引用其他Activities和交流必須通過該系統,從而 - 不像Activity/Fragment必須Parcelable/Bundle數據,該系統可以serailze/deserialze來完成。 當您將一個意向發送給另一個Activity時,您的Parcelable會通過系統並因此得到serailze/deserialze - 您在兩個不同的活動中有不同的對象引用。這不會發生在setArgumentFragmentActivity/Fragment沒有像不同的活動邊界。

0

這個區別不是putParcelableputExtra。 接受參數或接受參數的片段的活動不應該對傳入的數據進行變異,因爲它可以通過引用傳遞(作爲優化),也可以從包中重新創建(當需要時)。

如果要從活動中返回一些數據,請使用startActivityForResult()setResult()。如果你想從Fragment中返回一些數據,使用getActivity()從Fragment獲得一個宿主Activity並與之通信。

相關問題