Bundle在Android开发中非常常见,它的作用主要时用于传递数据。Bundle传递的数据包括:string、int、boolean、byte、float、long、double等基本类型或它们对应的数组,也可以是对象或对象数组。当Bundle传递的是对象或对象数组时,必须实现Serialiable或Parcelable接口。
Bundle所保存的数据是以key-value(键值对)的形式保存在ArrayMap中
例如:
Bundle args = new Bundle();
args.putString("MainActivity","Hello");
Bundle源码分析:
Bundle.java (frameworks\base\core\java\android\os) 39385 2017/8/25
public final class Bundle extends BaseBundle implements Cloneable, Parcelable {
public Bundle() {
super();
mFlags = FLAG_HAS_FDS_KNOWN | FLAG_ALLOW_FDS;
}
}
BaseBundle.java (frameworks\base\core\java\android\os) 48155 2017/8/25
public class BaseBundle {
BaseBundle() {
this((ClassLoader) null, 0);
}
BaseBundle(@Nullable ClassLoader loader, int capacity) {
mMap = capacity > 0 ?
new ArrayMap<String, Object>(capacity) : new ArrayMap<String, Object>(); //数据保存在这个ArrayMap中
mClassLoader = loader == null ? getClass().getClassLoader() : loader;
}
public void putString(@Nullable String key, @Nullable String value) {
unparcel();
mMap.put(key, value); //Bundle所保存的数据是以key-value(键值对)的形式保存在ArrayMap中
}
}
当传递的参数很多时可以传递一个对象。当Bundle传递的是对象或对象数组时,必须实现Serialiable或Parcelable接口。
a. 实现Serializable接口
package com.example.bundletest;
import java.io.Serializable;
public class FunPerson implements Serializable {
//创建实例变量
private String name;
private int num;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setNum(int num) {
this.num = num;
}
public int getNum() {
return num;
}
}
b. 向Bundle写入数据
public class MainActivity extends AppCompatActivity {
//声明控件对象
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取控件的对象
mButton = findViewById(R.id.button);
//为Button绑定监听器
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/**
* 存入数据
*/
FunPerson person = new FunPerson();
//设置数据
String name = "Trump is fun";
int num = 12345;
person.setName("name");
person.setNum(num);
//实例化一个Bundle
Bundle bundle = new Bundle();
//把FunPerson数据放入到Bundle容器中
bundle.putSerializable("Person", person);
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
//把Bundle容器中的数据放到Intent中
intent.putExtras(bundle);
//启动该Intent,实现Activity的跳转
startActivity(intent);
}
});
}
}
c. 从Bundle读取数据
public class SecondActivity extends AppCompatActivity {
//声明控件对象
private TextView textView;
@SuppressLint("SetTextI18n")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
//获取控件的对象
textView = findViewById(R.id.text_view);
/**
*读取数据
*/
Intent intent = getIntent();
//从Intent中取出Bundle
Bundle bundle = intent.getExtras();
//获取FunPerson里的数据数据
assert bundle != null;
FunPerson person = (FunPerson)bundle.getSerializable("Person");
assert person != null;
String name = person.getName();
int num = person.getNum();
//显示数据
textView.setText(name + "\n" + num);
}
}
Activity状态数据的保存与恢复,涉及到两个回调:
①void onSaveInstanceState(Bundle outState);② void onCreate(Bundle savedInstanceState);
参考:Android系统之onSaveInstanceState用法及源码分析
Fragment的setArguments方法:void setArgument(Bundle args);
参考:Android系统之Fragment用法
消息机制中的Message的setData方法:void setData(Bundle data)。
参考:Android系统线程间通信方式之Handler机制