Android項目中如何利用Intent傳遞數(shù)據(jù)?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、堯都網(wǎng)絡(luò)推廣、微信小程序、堯都網(wǎng)絡(luò)營銷、堯都企業(yè)策劃、堯都品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供堯都建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:chinadenli.net
Intent是什么
public class Intent implements Parcelable, Cloneable
上面是Intent類的完整聲明,可以知道它實現(xiàn)了Parcelable接口。Parcelable接口是什么呢?這東西是Android上專門用來對數(shù)據(jù)進(jìn)行序列化的,并且在跨進(jìn)程通訊時Parceable對象是可以直接傳輸?shù)摹?/p>
接下來我們來看看將數(shù)據(jù)放入Intent的時,做了哪些處理。
以String為例,先看putExtra方法的代碼
public Intent putExtra(String name, String value) { if (mExtras == null) { mExtras = new Bundle(); } mExtras.putString(name, value); return this; }
很簡單,就是將數(shù)據(jù)放入mExtras這個Bundle對象中,順便說一句Bundle類也實現(xiàn)了Parcelable接口。繼續(xù)往下跟代碼
public void putString(@Nullable String key, @Nullable String value) { unparcel(); mMap.put(key, value); }
內(nèi)部就是將數(shù)據(jù)放入一個Map中保存。到這里數(shù)據(jù)放入Intent的過程就完成了,實際上就是Intent中有一個Bundle對象,而這個Bundle對象中又有一個Map,然后數(shù)據(jù)就保存在這里。至于那個unparcel()方法與我們的分析過程無關(guān),有興趣的讀者可以去研究一下。
然后,我們再看取數(shù)據(jù)的過程。
繼續(xù)以String作為例子,看Intent中的代碼
public String getStringExtra(String name) { return mExtras == null ? null : mExtras.getString(name); }
mExtras應(yīng)該很熟悉了,這是個Bundle對象,剛剛保存數(shù)據(jù)的時候就是把數(shù)據(jù)保存在它里面的。再看它的getString方法
public String getString(@Nullable String key) { unparcel(); final Object o = mMap.get(key); try { return (String) o; } catch (ClassCastException e) { typeWarning(key, o, "String", e); return null; } }
就是直接從Map里面拿出我們之前保存的String,try語句只是在驗證取出的數(shù)據(jù)是否為String類型。
那照這么分析的話,兩個Activity中的對象應(yīng)該就是同一個對象才對?。?!為什么又說不是同一個對象呢?
為什么不是同一個對象?
如果你在putExtra之后,馬上又getExtra出來,那么你取出來的對象肯定是同一個對象,這個沒錯!
但是這里我們要注意兩點:
1.Intent中允許保存的數(shù)據(jù)類型是有限制的,準(zhǔn)確的說是Bundle的限制,因為實質(zhì)上數(shù)據(jù)是保存在Bundle中。如果我們要保存自己定義的對象,那么我們的對象必須實現(xiàn)了Parcelable接口或者Serializable接口。
2.我們使用Intent的方式,基本都是在一個Activity中存入,然后從另一個Activity中取出。
那么問題很明顯就出在Activity的啟動過程了。詳細(xì)的啟動過程大家可以參考老羅的文章Activity啟動過程。
這里大概說一下,首先我們的app運行在app自己的進(jìn)程appProcess中,然后系統(tǒng)在啟動的時候會啟動一個系統(tǒng)進(jìn)程systemProcess。而在Activity啟動時,需要向一個叫做ActivityManagerService的系統(tǒng)服務(wù)去注冊,這樣我們的Activity才能有生命周期的回調(diào)。這個ActivityManagerService服務(wù)就運行在systemProcess中。注冊完之后,再回到appProcess中,完成新Activity的啟動。在這個注冊過程中,我們的intent是全程參與的。
說到這里就明白了,當(dāng)我們調(diào)用startActivity(intent)啟動另外的Activity的時候,我們的intent已經(jīng)完成了兩次跨進(jìn)程通信,而它里面的對象已經(jīng)經(jīng)歷了兩輪序列化和反序列化,肯定不可能是同一個對象了。
這里順便說一個問題:為什么Serializable也可以跨進(jìn)程傳輸?
熟悉AIDL的同學(xué)都很清楚,AIDL跨進(jìn)程通信支持的數(shù)據(jù)類型是:
這里并不包括Serializable類型。
關(guān)于Android項目中如何利用Intent傳遞數(shù)據(jù)問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。
網(wǎng)頁標(biāo)題:Android項目中如何利用Intent傳遞數(shù)據(jù)
分享網(wǎng)址:http://chinadenli.net/article8/ppiiip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、外貿(mào)網(wǎng)站建設(shè)、微信公眾號、品牌網(wǎng)站設(shè)計、靜態(tài)網(wǎng)站、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)