1 Activity间传值方式
Intent 传值,取值。
Intent 传值 取值
Intent intent = new Intent();
intent.putExtra("demo1", "xxxx");
intent.putExtra("demo2", 50);
//取值
Intent intent = getIntent();
String demo1 = intent.getStringExtra("demo1");
int demo2 = intent.getIntExtra("demo2", 0);
Bundle 传值取值。
bundle 传值
Intent intent = new Intent(TaskCenterActivity.this,TaskDescActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(TaskConstants.TASK_TASKDESC_SERI,mTaskDescList);
intent.putExtras(bundle);
startActivity(intent);
bundle 取值
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
ArrayList<TaskDescData> tTaskDescList = (ArrayList<TaskDescData>) bundle.getSerializable(TaskConstants.TASK_TASKDESC_SERI);
2 Intent Bundle 传值区别
intent putExtra源码:
public @NonNull Intent putExtra(String name, boolean value) {
if (mExtras == null) {
mExtras = new Bundle();
}
mExtras.putBoolean(name, value);
return this;
}
public @NonNull Intent putIntegerArrayListExtra(String name, ArrayList<Integer> value) {
if (mExtras == null) {
mExtras = new Bundle();
}
mExtras.putIntegerArrayList(name, value);
return this;
}
/**
可以直接传递Arraylist,ArrayList已经实现了Serializable接口,内部对象也必须实现Serializable。
ublic class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
**/
源码内部维护一个Bundle,putExtra内部生成mExtras bundle对象,存放数据最终存入mExtras中。
Bundle 传值时最终会调用putExtras
public @NonNull Intent putExtras(@NonNull Bundle extras) {
if (mExtras == null) {
mExtras = new Bundle();
}
mExtras.putAll(extras);
return this;
}
最终还是传入mExtras中,所以两种传值方式最终都是通过Intent内部的一个Bundle对象。
所以取值也是通过内部的Bundle
public @Nullable Bundle getExtras() {
return (mExtras != null)
? new Bundle(mExtras)
: null;
}
3有了Intent传值方式为什么还需要Bundle方式
Intent传值可以应付一般的场景,但有些场景需要一个统一存储的方式更简单。
例如1:Intent设置了很多值,跳转到一个页面,然后每个取出,然后再把这些值传递到另外一个页面,又要设置很多次。
例如2:有些需要传递的数据可以先存放在bundle中,需要传值时直接使用,而不是一个一个在添加。
**思考: **fragment 为什么利用Fragment.setArguments(args)传值。