欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

简单讲述一下Intent的传值过程

发布时间:2024/7/5 编程问答 44 豆豆
生活随笔 收集整理的这篇文章主要介绍了 简单讲述一下Intent的传值过程 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

昨晚带女友Android入门,她本是照着一本书敲得,可以运行,后来她自己凭思维自己写了一个,然后出现了值没有传过来的问题,然后简单的了解了一下Intent是如何传递数据的。

我们的例子是这样的:

由A Activity通过startActivityForResult方法启动B Activity,然后由B将某个字符串返回给A,由于我女友的疏忽,key不小心写错了,当时我们使劲的找,却没发现问题,当时是这么找的,下面这段代码是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); 当时的调试信息是这样的:


Intent里面没有任何问题,我们确定已经把要传递的值放了进去,并且intent.mExtras.mMap的值不为空,但是,我们从A里面拿到的Intent对象intent.mExtras.mMap的值却为空!!这样我们百思不得其解,看:


注意到data.mExtras.mMap后面了吗?它居然是Null!!!这顿时就让我匪夷所思了,这是为什么呢,让我们去Intent内部一探究竟:

在Intent内部有这么一段代码:

public String getStringExtra(String name) {return mExtras == null ? null : mExtras.getString(name);}它是将数据放入一个Bundle属性里面去了,那再去mExtras里面看看:


我们可以看到在Bundler内部的mMap是有值的这个时候,咦?这是怎么回事呢?我们可以看到在mMap.get方法执行之前有个方法叫:unparcel();,那是不是在这个方法内部有蹊跷呢?

/*** 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;}
我们在 unparcel 方法内部看到,这个时候mMap是被赋值并且使用readMapInternal方法从某个地方读了出来(具体怎么读暂不去深究)。噢,原来就是这样。你们明白了嘛?


总结

以上是生活随笔为你收集整理的简单讲述一下Intent的传值过程的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。