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

简介: 昨晚带女友Android入门,她本是照着一本书敲得,可以运行,后来她自己凭思维自己写了一个,然后出现了值没有传过来的问题,然后简单的了解了一下Intent是如何传递数据的。 我们的例子是这样的: 由A Activity通过startActivityForResult方法启动B Activ...

昨晚带女友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方法从某个地方读了出来(具体怎么读暂不去深究)。噢,原来就是这样。你们明白了嘛?


目录
相关文章
|
5月前
|
存储 前端开发 JavaScript
PixiJS源码分析系列:第四章 响应 Pointer 交互事件(上篇)
PixiJS源码分析系列:第四章 响应 Pointer 交互事件(上篇)
|
8月前
|
Android开发
Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)
Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)
353 0
|
安全 编译器 C#
C#基础知识学习之 ✨ 委托(delegate) 与 事件(event) 之间的介绍
委托(delegate) 与 事件(event) 🔥 前言🙏 在之前的文章里介绍了C#中的委托(delegate) (Action、Func、Predicate)的基本含义及用法 那本篇文章在这里还要介绍一个跟委托有很大关系的小伙伴——C#中的 事件(event)🎅 事件跟委托是有很大联系的,所以也就导致很容易分不清他们两个,以及什么时候用这两个 上面有博客提到委托,想单独了解委托的可以去看一下,本篇文章主要说一下 什么是事件 🎄 以及 事件与委托的区别🎁
C#基础知识学习之 ✨ 委托(delegate) 与 事件(event) 之间的介绍
|
存储 JSON fastjson
Intent传递数据全解
Intent传递数据全解
160 0
|
Android开发
View事件分发相关结论的源码解析
View事件分发的三个核心方法有三个,分别是`dispatchTouchEvent`方法,`onInterceptTouchEvent`方法和`onInterceptTouchEvent`方法。 dispatchTouchEvent方法主要用来进行事件的分发。如果事件能够传递给当前View,那么此方法一定会被调用,返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法的影响,表示是否消耗当前事件。 onInterceptTouchEvent方法在dispatchTouchEvent方法内部调用,用来判断是否拦截某个事件,返回结果表示是否拦截