中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android項目中如何利用Intent傳遞數據

發布時間:2020-11-24 16:37:33 來源:億速云 閱讀:149 作者:Leah 欄目:移動開發

Android項目中如何利用Intent傳遞數據?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

Intent是什么

public class Intent implements Parcelable, Cloneable

上面是Intent類的完整聲明,可以知道它實現了Parcelable接口。Parcelable接口是什么呢?這東西是Android上專門用來對數據進行序列化的,并且在跨進程通訊時Parceable對象是可以直接傳輸的。

接下來我們來看看將數據放入Intent的時,做了哪些處理。

以String為例,先看putExtra方法的代碼

public Intent putExtra(String name, String value) {
    if (mExtras == null) {
      mExtras = new Bundle();
    }
    mExtras.putString(name, value);
    return this;
  }

很簡單,就是將數據放入mExtras這個Bundle對象中,順便說一句Bundle類也實現了Parcelable接口。繼續往下跟代碼

public void putString(@Nullable String key, @Nullable String value) {
    unparcel();
    mMap.put(key, value);
  }

內部就是將數據放入一個Map中保存。到這里數據放入Intent的過程就完成了,實際上就是Intent中有一個Bundle對象,而這個Bundle對象中又有一個Map,然后數據就保存在這里。至于那個unparcel()方法與我們的分析過程無關,有興趣的讀者可以去研究一下。

然后,我們再看取數據的過程。

繼續以String作為例子,看Intent中的代碼

public String getStringExtra(String name) {
    return mExtras == null ? null : mExtras.getString(name);
  }

mExtras應該很熟悉了,這是個Bundle對象,剛剛保存數據的時候就是把數據保存在它里面的。再看它的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語句只是在驗證取出的數據是否為String類型。
那照這么分析的話,兩個Activity中的對象應該就是同一個對象才對啊!!為什么又說不是同一個對象呢?

為什么不是同一個對象?

如果你在putExtra之后,馬上又getExtra出來,那么你取出來的對象肯定是同一個對象,這個沒錯!
但是這里我們要注意兩點:

1.Intent中允許保存的數據類型是有限制的,準確的說是Bundle的限制,因為實質上數據是保存在Bundle中。如果我們要保存自己定義的對象,那么我們的對象必須實現了Parcelable接口或者Serializable接口。

2.我們使用Intent的方式,基本都是在一個Activity中存入,然后從另一個Activity中取出。

那么問題很明顯就出在Activity的啟動過程了。詳細的啟動過程大家可以參考老羅的文章Activity啟動過程。

這里大概說一下,首先我們的app運行在app自己的進程appProcess中,然后系統在啟動的時候會啟動一個系統進程systemProcess。而在Activity啟動時,需要向一個叫做ActivityManagerService的系統服務去注冊,這樣我們的Activity才能有生命周期的回調。這個ActivityManagerService服務就運行在systemProcess中。注冊完之后,再回到appProcess中,完成新Activity的啟動。在這個注冊過程中,我們的intent是全程參與的。

說到這里就明白了,當我們調用startActivity(intent)啟動另外的Activity的時候,我們的intent已經完成了兩次跨進程通信,而它里面的對象已經經歷了兩輪序列化和反序列化,肯定不可能是同一個對象了。

這里順便說一個問題:為什么Serializable也可以跨進程傳輸?

熟悉AIDL的同學都很清楚,AIDL跨進程通信支持的數據類型是:

  • Java 的原生類型,如int,boolean,long,float…
  • String 和CharSequence
  • List 和 Map ,List和Map 對象的元素必須是AIDL支持的數據類型
  • AIDL 自動生成的接口 需要導入(import)
  • 實現android.os.Parcelable 接口的類. 需要導入(import)。

這里并不包括Serializable類型。

關于Android項目中如何利用Intent傳遞數據問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绥化市| 黑山县| 微山县| 肃南| 奎屯市| 涪陵区| 郓城县| 新乡县| 方山县| 乌拉特后旗| 仙游县| 景宁| 兰溪市| 石渠县| 磐石市| 内黄县| 柞水县| 阿勒泰市| 都昌县| 电白县| 柳江县| 东乡族自治县| 台前县| 东安县| 安陆市| 嫩江县| 星座| 岚皋县| 陕西省| 成都市| 台山市| 吉安市| 孟连| 昭通市| 繁昌县| 云林县| 堆龙德庆县| 兴文县| 葫芦岛市| 博乐市| 镇赉县|