分析 以下代码实际上做了什么?
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");