Android实际开发中我们经常需要使用Intent传值到下一个页面,例如A页面携带name,age传值给B页面,B页面取值的代码如下所示
setContentView(R.layout.activity_main);
String name=getIntent().getStringExtra("name");
int age=getIntent().getIntExtra("age",0);
一个页面的传递很好理解,这个时候是不会造成NullPointer异常的,因为name不传就默认为null,age指定了默认值是0;可是如果A1页面传给B 页面name,A2页面传给B页面age,请问B页面如何接收呢?如果不改变上述代码会造成空指针异常吗?
答案是不用更改代码,因为不会造成异常。
我以getIntent().getStringExtra(“name”)为例分析其源码:
源码1
public String getStringExtra(String name) {
return mExtras == null ? null : mExtras.getString(name);
}
源码2
public String getString(@Nullable String key) {
unparcel();
final Object o = mMap.get(key);//重点就在于这个方法,这是一个ArrayMap<String, Object>,用于取值
try {
return (String) o;
} catch (ClassCastException e) {
typeWarning(key, o, "String", e);
return null;
}
}
源码3
public V get(Object key) {
final int index = indexOfKey(key);//找到key对应的索引,如果不存在就返回负数,否则的话就取出key对应的vaule,重点在此
return index >= 0 ? (V)mArray[(index<<1)+1] : null;//将键值对保存成一个数组
}
上面三段源码将最最核心的源码指向了indexOfKey(key)这个方法:
源码4
public int indexOfKey(Object key) {
return key == null ? indexOfNull()
: indexOf(key, mIdentityHashCode ? System.identityHashCode(key) : key.hashCode());//继续深入此方法
}
源码5
122行 通过二分法查找这个数组中间的索引数
130行 如果正好中间的索引数对应的值正好是key,那么就返回这个索引
136-138 从中间到末尾找,找到和key值一样的索引数
141-143 从中间到开头找,找到和key值一样的索引数