最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android  Intent傳遞數(shù)據(jù)底層分析詳細介紹

 更新時間:2017年02月25日 16:42:29   投稿:lqh  
這篇文章主要介紹了Android Intent傳遞數(shù)據(jù)底層分析詳細介紹的相關(guān)資料,需要的朋友可以參考下

Android  Intent傳遞數(shù)據(jù)底層分析詳細介紹

我們知道在Activity切換時,如果需要向下一個ActivityB傳遞數(shù)據(jù),可以借助Intent對象的putExtra方法。

但是不知各位有沒有想過這樣一個問題:ActivityB中獲取到的對象跟上一個Activity中的那個對象有什么關(guān)系?

換句話說就是,我在ActivityB中通過Intent獲取的對象跟ActivityA中的那個對象,有沒有可能是同一個對象?

按照常理來說,博主提出一個設(shè)想后續(xù)的就是證明過程了,但是我要遺憾的告訴你,這里并非是同一個對象。(PS:廢話,如果是同一個對象,那還有EventBus這些東西什么事兒 T_T)

那么問題又來了,這兩個Activity都在同一個進程里面,甚至都在同一個線程里面,數(shù)據(jù)本來就是可以共享的,為什么從一個Activity傳到另一個Activity之后,就不是一個對象了呢?它從什么時候變成另外的對象的呢?

不著急,且聽我慢慢道來。

Intent是什么東西?

public class Intent implements Parcelable, Cloneable

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

接下來我們來看看將數(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的啟動過程了。詳細的啟動過程大家可以參考老羅的文章Activity啟動過程。

這里大概說一下,首先我們的app運行在app自己的進程appProcess中,然后系統(tǒng)在啟動的時候會啟動一個系統(tǒng)進程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īng)經(jīng)歷了兩輪序列化和反序列化,肯定不可能是同一個對象了。

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

熟悉AIDL的同學(xué)都很清楚,AIDL跨進程通信支持的數(shù)據(jù)類型是:

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

這里并不包括Serializable類型。

于是去看了源碼,發(fā)現(xiàn)是Parcel自己對Serializable類型的對象做了兼容,可以直接寫入其中。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • Android實現(xiàn)評論欄隨Recyclerview滑動左右移動

    Android實現(xiàn)評論欄隨Recyclerview滑動左右移動

    這篇文章主要介紹了Android實現(xiàn)評論欄隨Recyclerview滑動左右移動效果,仿約會吧應(yīng)用詳情頁實現(xiàn),感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android高級動畫篇之SVG矢量動畫范例

    Android高級動畫篇之SVG矢量動畫范例

    矢量動畫即是在計算機中使用數(shù)學(xué)方程來描述屏幕上復(fù)雜的曲線,利用圖形的抽象運動特征來記錄變化的畫面信息的動畫,本篇帶你了解在Android中的矢量動畫
    2021-11-11
  • Android Studio新建工程默認在build.gradle中加入maven阿里源的問題

    Android Studio新建工程默認在build.gradle中加入maven阿里源的問題

    這篇文章主要介紹了Android Studio新建工程默認在build.gradle中加入maven阿里源的問題,本文通過實例代碼相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Kotlin協(xié)程Dispatchers原理示例詳解

    Kotlin協(xié)程Dispatchers原理示例詳解

    這篇文章主要為大家介紹了Kotlin協(xié)程Dispatchers原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Android WaveView實現(xiàn)水流波動效果

    Android WaveView實現(xiàn)水流波動效果

    這篇文章主要介紹了 Android自定義控件 WaveView實現(xiàn)水流波動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 淺談Android invalidate 分析

    淺談Android invalidate 分析

    本篇文章主要介紹了淺談Android invalidate 分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Android消息通知Notification常用方法(發(fā)送消息和接收消息)

    Android消息通知Notification常用方法(發(fā)送消息和接收消息)

    最近在做消息通知類Notification的相關(guān)業(yè)務(wù),利用閑暇時間總結(jié)一下,主要分為兩部分來記錄:發(fā)送消息和接收消息,對Android消息通知相關(guān)知識感興趣的朋友一起看看吧
    2024-02-02
  • Flutter軟鍵盤的原理淺析

    Flutter軟鍵盤的原理淺析

    大家應(yīng)該都知道目前Flutter官方是沒有自定義鍵盤的解決方案,下面這篇文章主要給大家介紹了關(guān)于Flutter軟鍵盤原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-10-10
  • Android 8.0 慢充和快充提示語的實現(xiàn)原理

    Android 8.0 慢充和快充提示語的實現(xiàn)原理

    這篇文章主要介紹了Android 8.0 慢充和快充提示語的實現(xiàn)原理,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-05-05
  • Android仿抖音主頁效果實現(xiàn)代碼

    Android仿抖音主頁效果實現(xiàn)代碼

    這篇文章主要介紹了Android仿抖音主頁效果實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12

最新評論

锦屏县| 龙州县| 阿城市| 德保县| 玛多县| 秦皇岛市| 尖扎县| 开化县| 建阳市| 盐山县| 罗定市| 吴堡县| 湘阴县| 雅江县| 新化县| 栾川县| 蛟河市| 伊吾县| 南郑县| 县级市| 柳林县| 澎湖县| 大宁县| 加查县| 乌拉特前旗| 巨鹿县| 华池县| 怀柔区| 深圳市| 鄂伦春自治旗| 常德市| 巨野县| 丘北县| 连平县| 孝义市| 大港区| 湘潭县| 普安县| 肇源县| 阿克苏市| 定州市|