安卓提供了Intent机制来实现应用间的通信,可以在Activity之间、Service、BroadCast中传递数据。提起Intent,我们最熟悉的可能就是在启动Activity的时候携带数据,使用非常简单:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("param1","我是参数1");
startActivity(intent);
在新的Activity,也就是Activity中获取数据也是非常的简单:
String param1 = getIntent().getStringExtra("param1");
我们可以看到在传值的时候,调用了Intent的putExtra方法,我们查看Intent的源码,发现Intent中定义了许多的putExtra方法,以咱们的上面的调用为例,实际上是调用了如下的方法:
public Intent putExtra(String name, String value) {
if (mExtras == null) {
mExtras = new Bundle();
}
mExtras.putString(name, value);
return this;
}
从上面的代码我们可以明白,在Intent中定义了一个Bundle类型的变量mExtras,当调用Intent的putExtra时,会根据第二个参数类型的不同,调用Bundle的对应方法。我们跑到Bundle会惊喜的发现没有putString方法,所以只能到它的父类BaseBundle中寻找,结果如下:
ArrayMap<String, Object> mMap = null;
<-省略部分代码->
public void putString(@Nullable String key, @Nullable String value) {
unparcel();
mMap.put(key, value);
}
我们接着看看unparcel这个方法
synchronized void unparcel() {
synchronized (this) {
f