Bundle的概念理解
Bundle对于Android开发者来说肯定非常眼熟,它经常出现在以下场合:
- Activity状态数据的保存与恢复涉及到的两个回调:
void onSaveInstanceState (Bundle outState)
、void onCreate (Bundle savedInstanceState)
- Fragment的setArguments方法:
void setArguments (Bundle args)
- 消息机制中的Message的setData方法:
void setData (Bundle data)
- 其他场景不再列举
Bundle从字面上解释为“一捆、一批、一包”,结合上述几个应用场合,可以知道Bundle是用来传递数据的,我们暂将Bundle理解为Android中用来传递数据的一个容器。官方文档对Bundle的说明如下:
A mapping from String values to various Parcelable types.
官方意为Bundle封装了String值到各种Parcelable类型数据的映射,可见跟我们上述理解是吻合的。
Bundle源码分析
知道了Bundle的主要作用,再来看源码就容易理解了。
Bundle位于android.os
包中,是一个final类,这就注定了Bundle不能被继承。Bundle继承自BaseBundle并实现了Cloneable和Parcelable两个接口,因此对Bundle源码的分析会结合着对BaseBundle源码进行分析。由于实现了Cloneable和Parcelable接口,因此以下几个重载是必不可少的:
public Object clone()
public int describeContents()
public void writeToParcel(Parcel parcel, int flags)
public void readFromParcel(Parcel parcel)
public static final Parcelable.Creator<Bundle> CREATOR = new Parcelable.Creator<Bundle>()
以上代码无需过多解释。
Bundle的几个公有构造方法
公有构造方法 | 说明 |
---|---|
public Bundle() | Constructs a new, empty Bundle |
public Bundle(ClassLoader loader) | Constructs a new, empty Bundle that uses a specific ClassLoader for instantiating Parcelable and Serializable objects. |