為什么Intent傳遞對(duì)象為什么需要序列化?(阿里)
這道題想考察什么衙傀?
掌握序列化的意義與Android數(shù)據(jù)傳輸?shù)脑?/p>
考察的知識(shí)點(diǎn)
序列化
Binder
考生應(yīng)該如何回答
在Android中使用Intent傳輸數(shù)據(jù)除了基本數(shù)據(jù)類型之外跟束,對(duì)于其他類型對(duì)象需要此類型實(shí)現(xiàn)了Serializable或者Parcelable序列化接口才能進(jìn)行傳輸莺奸。
以startActivity為例:
Intent intent = new Intent(context,OtherActivity.class);
//字符串實(shí)現(xiàn)了Serializable序列化
intent.putExtra("a","享學(xué)");
//Message實(shí)現(xiàn)了Parcelable序列化
intent.putExtra("b",new android.os.Message());
//錯(cuò)誤:上下文context并未實(shí)現(xiàn)序列化
intent.putExtra("c",context);
startActivity(intent);
Intent傳輸數(shù)據(jù)本質(zhì)上是使用Binder來(lái)完成的。Intent啟動(dòng)組件需要借助AMS完成泳炉,因此startActivity
會(huì)離開(kāi)當(dāng)前應(yīng)用進(jìn)程憾筏,進(jìn)入AMS所在的system_server進(jìn)程進(jìn)行跨進(jìn)程通信。這就意味著傳輸?shù)膶?duì)象需要在不同進(jìn)程之間進(jìn)行傳輸花鹅。
為了保護(hù)不同進(jìn)程互不干擾氧腰,進(jìn)程隔離讓system_server進(jìn)程無(wú)法直接獲取應(yīng)用進(jìn)程內(nèi)存中的對(duì)象。因此必須通過(guò)類似于復(fù)制的手段刨肃,將應(yīng)用進(jìn)程的對(duì)象傳遞給system_server進(jìn)程古拴,再由system_server進(jìn)程傳遞給應(yīng)用中的OtherActivity
。
根據(jù)《2.9 序列Parcelable,Serializable的區(qū)別真友?》可知黄痪,Serializable會(huì)利用IO將對(duì)象寫入到文件中;而Parcelable則會(huì)將對(duì)象寫入到Parcel中盔然,兩種方式都可以解決跨進(jìn)程的數(shù)據(jù)傳遞桅打。因此Intent傳遞的對(duì)象需要實(shí)現(xiàn)Serializable或者Parcelable序列化。