简单讲述一下Intent的传值过程
昨晚帶女友Android入門,她本是照著一本書敲得,可以運(yùn)行,后來她自己憑思維自己寫了一個(gè),然后出現(xiàn)了值沒有傳過來的問題,然后簡(jiǎn)單的了解了一下Intent是如何傳遞數(shù)據(jù)的。
我們的例子是這樣的:
由A Activity通過startActivityForResult方法啟動(dòng)B Activity,然后由B將某個(gè)字符串返回給A,由于我女友的疏忽,key不小心寫錯(cuò)了,當(dāng)時(shí)我們使勁的找,卻沒發(fā)現(xiàn)問題,當(dāng)時(shí)是這么找的,下面這段代碼是B回傳字符串值給A:
Intent intent = new Intent(); <span style="white-space:pre"> </span>intent.putExtra("helloWorld", "HelloWorld"); <span style="white-space:pre"> </span>setResult(Activity.RESULT_OK, intent); 當(dāng)時(shí)的調(diào)試信息是這樣的:
Intent里面沒有任何問題,我們確定已經(jīng)把要傳遞的值放了進(jìn)去,并且intent.mExtras.mMap的值不為空,但是,我們從A里面拿到的Intent對(duì)象intent.mExtras.mMap的值卻為空!!這樣我們百思不得其解,看:
注意到data.mExtras.mMap后面了嗎?它居然是Null!!!這頓時(shí)就讓我匪夷所思了,這是為什么呢,讓我們?nèi)ntent內(nèi)部一探究竟:
在Intent內(nèi)部有這么一段代碼:
public String getStringExtra(String name) {return mExtras == null ? null : mExtras.getString(name);}它是將數(shù)據(jù)放入一個(gè)Bundle屬性里面去了,那再去mExtras里面看看:
我們可以看到在Bundler內(nèi)部的mMap是有值的這個(gè)時(shí)候,咦?這是怎么回事呢?我們可以看到在mMap.get方法執(zhí)行之前有個(gè)方法叫:unparcel();,那是不是在這個(gè)方法內(nèi)部有蹊蹺呢?
/*** If the underlying data are stored as a Parcel, unparcel them* using the currently assigned class loader.*//* package */ synchronized void unparcel() {if (mParcelledData == null) {return;}int N = mParcelledData.readInt();if (N < 0) {return;}if (mMap == null) {mMap = new HashMap<String, Object>(N);}mParcelledData.readMapInternal(mMap, N, mClassLoader);mParcelledData.recycle();mParcelledData = null;}我們?cè)?unparcel 方法內(nèi)部看到,這個(gè)時(shí)候mMap是被賦值并且使用readMapInternal方法從某個(gè)地方讀了出來(具體怎么讀暫不去深究)。噢,原來就是這樣。你們明白了嘛?
總結(jié)
以上是生活随笔為你收集整理的简单讲述一下Intent的传值过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyTorch 读取大数据
- 下一篇: 【LeetCode】3月30日打卡-Da