面試題:兩個(gè)Activity之間如何傳遞參數(shù)?
除了傳遞基本類型外,傳遞自定義的對象需要實(shí)現(xiàn)Parcelable或者Serializable接口。
區(qū)別
兩種都是用于支持序列化、反序列化話操作。
- 兩者最大的區(qū)別在于存儲(chǔ)媒介的不同,Serializable使用IO讀寫存儲(chǔ)在硬盤上,而Parcelable是直接在內(nèi)存中讀寫,很明顯內(nèi)存的讀寫速度通常大于IO讀寫,所以在Android中通常優(yōu)先選擇Parcelable。
- Serializalbe會(huì)使用反射,序列化和反序列化過程需要大量I/O操作,Parcelable自已實(shí)現(xiàn)封送和解封(marshalled &unmarshalled)操作不需要用反射,數(shù)據(jù)也存放在Native內(nèi)存中,效率要快很多。
Pacelable 和 Serializable 序列化的作用是不同的,Pacelable 是為了“傳遞”,而 Serializable 是為了“儲(chǔ)存”。另外 Serializable 之所以慢,是由于為了讀取對象中的成員變量而使用的大量的反射,而 Pacelable 的讀寫都是自己實(shí)現(xiàn)的。還有 Serializable 也是可以自己設(shè)置不想要序列化的屬性的,只需要在該變量前加一個(gè) transient 關(guān)鍵字(static 標(biāo)記的屬性也是不能序列化的,但是 static final 的可以)。
效率及選擇
Parcelable的性能比Serializable好,在內(nèi)存開銷方面較小,所以在內(nèi)存間數(shù)據(jù)傳輸時(shí)推薦使用Parcelable,如activity間傳輸數(shù)據(jù),而Serializable可將數(shù)據(jù)持久化方便保存,所以在需要保存或網(wǎng)絡(luò)傳輸數(shù)據(jù)時(shí)選擇Serializable,因?yàn)閍ndroid不同版本Parcelable可能不同,所以不推薦使用Parcelable進(jìn)行數(shù)據(jù)持久化.
Parcelable和Parcle這兩者之間的關(guān)系?
Parcelable 接口定義在封送/解封送過程中混合和分解對象的契約。Parcelable接口的底層是Parcel容器對象。
Parcel類是一種最快的序列化/反序列化機(jī)制,專為Android中的進(jìn)程間通信而設(shè)計(jì)。該類提供了一些方法來將成員容納到容器中,以及從容器展開成員。
在兩個(gè)Activity之前傳遞對象還要注意什么呢?
一定要要注意對象的大小,Intent中的Bundle是在使用Binder機(jī)制進(jìn)行數(shù)據(jù)傳遞的,能使用的Binder的緩沖區(qū)是有大小限制的(有些手機(jī)是2M),而一個(gè)進(jìn)程默認(rèn)有16個(gè)binder線程,所以一個(gè)線程能占用的緩沖區(qū)就更小了(以前做過測試,大約一個(gè)線程可以占用128KB)。所以當(dāng)你看到“The Binder transaction failed because it was too large.”這類TransactionTooLargeException異常時(shí),你應(yīng)該知道怎么解決了。
binder不是用來跨進(jìn)程通信的嗎?為什么activity間傳遞bundle要使用binder?
很多Activity并不是在一個(gè)進(jìn)程中,比如你從自己的應(yīng)用通過Intent打開一個(gè)發(fā)Email的Activity,你要往這樣Activity傳一些諸如收件人、主題等信息吧。這樣一想Intent的傳遞肯定就是要跨進(jìn)程的了.