微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android Studio使用structure分析源码

分析 以下代码实际上做了什么?

1.Intent intent= new Intent(MainActivity.this, AActivity.class);//获取类名
2.intent.putExtra("xcj","123");

1.首先打开Intent的源码(在下载了源码包的前提下,使用ctrl+左键点击Intent就可以看到源码),如下:

在这里插入图片描述

显然,这是一个Intent的构造方法(无返回类型),从structure处可以看到是否有其他的构造方法
你不知道如何打开structure?如下:然后会在侧边栏出现structure,以后只需要点击这里就好了

在这里插入图片描述

然后查看红色圆圈m中的(m表示method),该类中的所有方法(包括构造方法)都会显示在这里

在这里插入图片描述

2.这里先讲解一下structure的使用

在这里插入图片描述

p为Properties(属性),f为field(字段)
属性和字段的区别:属性有get和set方法,如下:
属性action有getAction()和setAction方法来进行赋值操作,事实上,属性和字段不都是一个变量(或常量)吗,为什么要区分二者?你可以这样想:这是为了防止开发者错误赋值带来的不安全性,也就是相当于对开发者的提醒,源码没有给你提供get和set方法的变量不要去赋值(也就是说你虽然可以去赋值,但是很可能会引发一些问题)

在这里插入图片描述


下面这个锁表示 显示非公开的内容,选上,不然private等修饰的内容都看不到

在这里插入图片描述


3.继续分析Intent

在这里插入图片描述


该Intent需要两个参数,这里传入两个类,又将其给了那么ComponentName(packageContext, cls),那它做了什么,

在这里插入图片描述


显然,它获取了类名,并付给了mPackage和mClass,因此可以知道new ComponentName(packageContext, cls);这个实例中有两个存储了类名的变量,这个实例赋给了mComponent,则通过mComponent.mPackage和mComponent.mClass就可以获取类名,那么就可以通过intent.mComponent.mPackage和intent.mComponent.mClass获取类名。
总结:

Intent intent= new Intent(MainActivity.this, AActivity.class);//获取类名

这条语句获取了MainActivity和AActivity的类名
4.分析

intent.putExtra("xcj","123");

同样查看源码:

在这里插入图片描述


首先看Bundle是什么?一层一层往下看,从这里还是不知道它做了什么,看他调用父类构造方法super();

在这里插入图片描述


在该方法中从注释中可以看出他是创建了一个空Bundle,继续看this,这是BaseBundle类的调用其实例的构造方法,往下看

在这里插入图片描述


注释中的意思:
构造一个新的空包,该包使用特定的类加载器
实例化可打包和可序列化对象。
@param loader实例化对象时要使用的显式类加载器
包里面。
@param capacity ArrayMap的初始大小
可以知道这里创建了一个capacity大小的ArrayMap用于存储键值对,并赋给了mMap,显然我们可通过mMap.put()来给mMap进行键值对的添加,也就是可以通过Bundle的实例 bundle.mMap.put()来给mMap进行键值对的添加,看完了Bundle进行一下总结

在这里插入图片描述


总:new Bundle()创建了一个实例,在实例主要进行了 Bundle实例下的变量mFlags 的赋值(暂时不知道有啥作用),以及 Bundle实例下的变量mMap 创建了一个ArrayMap<String, Object>,以及 Bundle实例下的变量 mClassLoader进行赋值,(这些变量有Bundle类继承自其父类),最后该Bundle实例赋给了mExtras,则可以通过mExtras.mMap.put();来给mMap添加键值对。

那么再来看mExtras.putString(name, value);做了什么 。

在这里插入图片描述


先不管unparcel();看到mMap.put()就已经知道他给mMap添加了键值对

最后总结第二条语句做了什么。

intent.putExtra("xcj","123");

该语句将键值对"xcj"和"123"储存到Bundle类的实例mExtras中了,而mExtras是intend的一个变量,也就是将该键值对储存到intent中去了,显然,在内部,可以通过intent.mExtras.mMap.get()来获取该键值对。

总:以上全部都只是在分析以下两句代码实际上做了什么,了解它是怎么做的,在分析其他源码的时候可以采取同样的办法

Intent intent= new Intent(MainActivity.this, AActivity.class);//获取类名
 intent.putExtra("xcj","123");

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐