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");

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...